Ich hoffe ich bin hier an der richtigen Anlaufstelle.
Ich arbeite als Network Engineer, und in meiner Firma, einem mittelgroßen Serviceprovider, wurden reichlich Cisco 2911 Router verschrottet.
Nun durfte ich mir 9 Stück davon mitnehmen, und an sich sind das super Geräte. Leider endet der Support von Cisco, und die Geräte sind nahezu nutzlos für den Normalo.
Leider bin ich kein besonderer Fan davon funktionierende Hardware wegzuwerfen, daher möchte ich als kleines Hobbyprojekt zumindest noch versuchen was draus zu machen.
Vor einigen Jahren durfte ich mithelfen einen TP-Link EAP245 Access Point auf OpenWrt zu porten, ähnliches möchte ich auch gerne für den Cisco 2911 Router machen.
Bisher musste ich jedoch noch nie Code cross-compilen, sondern ich konnte immer irgendwo binaries beziehen.
Nun brauche ich folgendes. Es existiert ein Projekt zum Cisco 3600 Router welcher die gleiche CPU, und den gleichen Galileo Chipsatz besitzt wie mein aktuelles System. Leider wurde das Projekt für den 3600 vor etwa 10 Jahren eingestellt, und das einzige Überbleibsel was wichtig ist ist hier.
https://git.bocc.de/jochen/cilo
Dabei handelt es sich um einen "Bootloader" welcher durch den internen Cisco ROMMON Bootloader gestartet wird, und dann Multisegment MIPS III ELF Executables ausführen kann, z.B. einen Linux Kernel booten kann.
Das wäre mein nächster wichtiger Schritt um weiter zu kommen. Ein Hello World ELF Programm konnte ich bereits auf meiner Kiste ausführen.
An sich gibt es immense Fortschritte, aber nun scheiter ich an dem Compiling von diesem Projekt.
In meiner Debian Maschine habe ich mir das Paket gcc-mips-linux-gnu installiert, und versucht das Projekt mit angepasster Makefile zu compilen (angepasst da es mips-elf-gcc in dem Paket wohl nicht gibt).
Das ganze ist fehlgeschlagen mit folgendem Output.
Code: Alles auswählen
elf_loader.c: In function ‘load_elf32_file’:
elf_loader.c:83:37: warning: logical not is only applied to the left hand side of comparison [-Wlogical-not-parentheses]
83 | if (!hdr.ident[ELF_INDEX_CLASS] == ELF_CLASS_32)
| ^~
elf_loader.c:83:9: note: add parentheses around left hand side expression to silence this warning
83 | if (!hdr.ident[ELF_INDEX_CLASS] == ELF_CLASS_32)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
| ( )
elf_loader.c: In function ‘load_elf64_file’:
elf_loader.c:207:39: warning: comparison of constant ‘2’ with boolean expression is always false [-Wbool-compare]
207 | if (!hdr.e_ident[ELF_INDEX_CLASS] == ELF_CLASS_64)
| ^~
elf_loader.c:207:39: warning: logical not is only applied to the left hand side of comparison [-Wlogical-not-parentheses]
elf_loader.c:207:9: note: add parentheses around left hand side expression to silence this warning
207 | if (!hdr.e_ident[ELF_INDEX_CLASS] == ELF_CLASS_64)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| ( )
mips-linux-gnu-gcc -mno-abicalls -fno-builtin -fomit-frame-pointer -fno-pic -Wall -DLOADADDR=0x80028000 -Iinclude/ -Imach/c3600 -Iinclude/mach/c3600 -c lzma_loader.c
mips-linux-gnu-gcc -mno-abicalls -fno-builtin -fomit-frame-pointer -fno-pic -Wall -DLOADADDR=0x80028000 -Iinclude/ -Imach/c3600 -Iinclude/mach/c3600 -c LzmaDecode.c
Making all in mach/c3600...
make[1]: Entering directory '/tmp/cilo/mach/c3600'
mips-linux-gnu-gcc -mno-abicalls -fno-builtin -fomit-frame-pointer -fno-pic -Wall -DLOADADDR=0x80028000 -I../../include -D__ASSEMBLY__-xassembler-with-cpp -traditional-cpp -c start.S
In file included from start.S:6:
../../include/asm/regdef.h:15: warning: "_MIPS_SIM" redefined
15 | #define _MIPS_SIM _MIPS_SIM_ABI32
|
<built-in>: note: this is the location of the previous definition
mips-linux-gnu-gcc -mno-abicalls -fno-builtin -fomit-frame-pointer -fno-pic -Wall -DLOADADDR=0x80028000 -I../../include -c promlib.c
promlib.c: In function ‘c_baud’:
promlib.c:204:1: warning: control reaches end of non-void function [-Wreturn-type]
204 | }
| ^
mips-linux-gnu-gcc -mno-abicalls -fno-builtin -fomit-frame-pointer -fno-pic -Wall -DLOADADDR=0x80028000 -I../../include -c platform.c
mips-linux-gnu-gcc -mno-abicalls -fno-builtin -fomit-frame-pointer -fno-pic -Wall -DLOADADDR=0x80028000 -I../../include -c platio.c
make[1]: Leaving directory '/tmp/cilo/mach/c3600'
mips-linux-gnu-gcc -Ttext 0x80008000 --omagic -nostartfiles -nostdlib --discard-all --strip-all --entry _start string.o main.o ciloio.o printf.o elf_loader.o lzma_loader.o LzmaDecode.o mach/c3600/promlib.o mach/c3600/start.o mach/c3600/platio.o mach/c3600/platform.o -o ciscoload.elf
mips-linux-gnu-gcc: error: unrecognized command-line option ‘--omagic’
mips-linux-gnu-gcc: error: unrecognized command-line option ‘--discard-all’
mips-linux-gnu-gcc: error: unrecognized command-line option ‘--strip-all’
make: *** [Makefile:85: ciscoload] Error 1
Weiss jemand wo genau das Problem liegt? Die Headerdateien sind vorhanden, vorallem an dieser Stelle hier brauche ich mal eure Unterstützung.
Ich persönlich programmiere zwar ein bisschen in C, aber meine Programme beschränken sich immer nur auf eine einzige Datei, daher habe ich noch nie mit Linkern gearbeitet.
Code: Alles auswählen
make[1]: Entering directory '/root/cilo/mach/c3600'
make[1]: Nothing to be done for 'all'.
make[1]: Leaving directory '/root/cilo/mach/c3600'
mips-linux-gnu-ld -Ttext 0x80008000 --omagic -nostartfiles -nostdlib --discard-all --strip-all --entry _start string.o main.o ciloio.o printf.o elf_loader.o lzma_loader.o LzmaDecode.o mach/c3600/promlib.o mach/c3600/start.o mach/c3600/platio.o mach/c3600/platform.o -o ciscoload.elf
main.o: In function `start_bootloader':
main.c:(.text+0x60): undefined reference to `printf'
main.c:(.text+0x8c): undefined reference to `printf'
main.c:(.text+0xb4): undefined reference to `printf'
main.c:(.text+0xc4): undefined reference to `printf'
main.c:(.text+0xdc): undefined reference to `printf'
main.o:main.c:(.text+0x22c): more undefined references to `printf' follow
Makefile:88: recipe for target 'ciscoload' failed
make: *** [ciscoload] Error 1
Falls es weiterhin interessant ist, halte ich gerne über den Fortschritt des Projekts auf dem laufenden. Ich denke sobald ein Linux Kernel läuft ist die halbe Miete schon mal durch.