Hilfe beim Compilen mit Cross-Toolchain - Cisco 2911 auf OpenWrt Projekt

Smalltalk
Antworten
Knogle
Beiträge: 465
Registriert: 06.05.2016 19:29:00
Lizenz eigener Beiträge: MIT Lizenz

Hilfe beim Compilen mit Cross-Toolchain - Cisco 2911 auf OpenWrt Projekt

Beitrag von Knogle » 18.04.2022 18:42:31

Hallo Freunde, ich grüße euch :=)

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
Dann habe ich das ganze angepasst da an einer Stelle wohl mips-linux-gnu-ld statt gcc genutzt werden muss, aber nun komme ich hierbei raus.
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
Ich würde mich sehr freuen falls es hier den ein oder anderen gibt der hier ein bisschen helfen kann.
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.

Benutzeravatar
Tintom
Moderator
Beiträge: 3033
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: Hilfe beim Compilen mit Cross-Toolchain - Cisco 2911 auf OpenWrt Projekt

Beitrag von Tintom » 18.04.2022 19:18:54

Bezüglich:

Code: Alles auswählen

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
würde ich erstmal die Optionen aus dem Makefile nehmen.

Und hier:

Code: Alles auswählen

main.c:(.text+0x8c): undefined reference to `printf'
main.c:(.text+0xb4): undefined reference to `printf'
main.c:(.text+0xc4): undefined reference to `printf'
Spricht etwas dagegen printf aus stdio.h zu verwenden?

Benutzeravatar
Livingston
Beiträge: 1454
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: Hilfe beim Compilen mit Cross-Toolchain - Cisco 2911 auf OpenWrt Projekt

Beitrag von Livingston » 18.04.2022 19:43:57

Code: Alles auswählen

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)
Das ist kein Fehler, sondern eine Warnung, die durch den Compiler-Schalter -Wlogical-not-parentheses hervorgerufen wird. Es wird angemäkelt, dass das Konstrukt ohne Klammern unsauber erscheint. Besser wäre also im Sourcecode:

Code: Alles auswählen

if (! (hdr.ident[ELF_INDEX_CLASS] == ELF_CLASS_32))
oder

Code: Alles auswählen

if (hdr.ident[ELF_INDEX_CLASS] != ELF_CLASS_32)
Außerdem könntest Du im make-file den Schalter -Wlogical-not-parentheses eliminieren. Ist aber unsauberer, Warnungen sollte man lieber korrigieren statt sie zu ignorieren.
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams

Knogle
Beiträge: 465
Registriert: 06.05.2016 19:29:00
Lizenz eigener Beiträge: MIT Lizenz

Re: Hilfe beim Compilen mit Cross-Toolchain - Cisco 2911 auf OpenWrt Projekt

Beitrag von Knogle » 18.04.2022 23:24:55

Hey ich danke euch beiden bereits.
Im Grunde liegt meine Nummer 1 Priorität darauf, irgendeine Binary kompiliert zu bekommen, undabhängig vom potentiellen Warnings.
Ich habe mal versucht das so umzubauen und den printf header herauszunehmen und stdio.h zu nutzen, aber da kommt die gleiche Meldung.
Habe ich überhaupt die richtige Toolchain?
In der "original" Makefile ist von "mips-elf-gcc" die Rede, aber ich habe die gnu-linux mips Toolchain.
Die "mips-elf-gcc" toolchain von mips.org kriegt man leider auch nirgendwo mehr, selbst im archive.org Fehlanzeige.

Benutzeravatar
Livingston
Beiträge: 1454
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: Hilfe beim Compilen mit Cross-Toolchain - Cisco 2911 auf OpenWrt Projekt

Beitrag von Livingston » 19.04.2022 02:02:26

Knogle hat geschrieben: ↑ zum Beitrag ↑
18.04.2022 23:24:55
Habe ich überhaupt die richtige Toolchain?
Dazu kann ich leider nicht viel sagen. Vielleicht sind ein paar MIPS-Kenner hier?

Wo es wahrscheinlich scheppert ist eine Kombination aus verschiedenen nicht erfüllten Abhängigkeiten.
Einerseits taucht im Aufruf auf:

Code: Alles auswählen

-nostartfiles -nostdlib
Damit wird erst mal Krempel wie stdlib.so, stdio.so und einiges andere vom Verlinken ausgeschlossen.

Andererseits wird in der selben Zeile printf.o explizit aufgenommen. Was ich hier vermisse, ist der Pfad zu den *.o-Dateien. Wenn Du den Aufruf nicht im selben Verzeichnis startest, wo diese Objektdateien stecken, werden sie so nicht gefunden. Workaround wäre also Finden der Dateien und dann Ergänzung der Suchpfade.

Viel Glück! :wink:
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams

Antworten