Ich habe ein integriertes Hardwaresystem, das einen Bootloader enthält, der auf ARMboot basiert (was sehr ähnlich zu Uboot und PPCboot ist).
Dieser Bootloader dient normalerweise dazu, das uClinux-Image aus dem Flash zu laden. Jetzt versuche ich jedoch, diesen Bootloader zu verwenden, um eine eigenständige helloworld-Anwendung auszuführen, die keine verknüpfte Bibliothek erfordert. Tatsächlich enthält es nur while(1){}
code in der Hauptfunktion.
Mein Problem ist, dass ich nicht herausfinden kann, welche GCC-Einstellungen ich verwenden sollte, um eine eigenständige, richtig formatierte Binärdatei zu erstellen.
Ich benutze folgenden Build-Befehl:
%Vor% erzeugt eine Warnmeldung:
Warnung: Eintragssymbol kann nicht gefunden werden _start; Standard ist 00000004
Danach lade ich innerhalb des Bootloaders eine erstellte Anwendung hoch und starte sie unter einer Adresse:
%Vor%Aber es funktioniert nicht :( Das System wird neu gestartet.
Normalerweise sollte es nur hängen (wegen while(1)
).
Ich kenne diesen Loader nicht, aber ich denke, Sie sollten objcopy so verwenden, um Ihre ausführbaren Daten in eine rohe Binärdatei zu schreiben. Springe nicht zu ELF-Headern, Leute:)
%Vor%Versuchen Sie auch, positionsunabhängigen Code zu kompilieren und ld und gcc Handbücher zu lesen.
Der Linker beschwert sich über fehlenden Startup-Code.
Sie müssen zwei Dinge angeben: Startcode und eine Linker-Befehlsdatei, die die Adresszuordnung Ihres Zielprozessors definiert.
In Ihrem Fall ist der Startcode wie "bl main", aber normalerweise initialisiert der Startup-Code den Stack-Pointer mindestens vor dem Verzweigen zu main.
Wenn Sie wissen, dass Sie Ihr Beispiel in den Arbeitsspeicher laden, können Sie Ihr Programm direkt auf main starten. Sie müssen die Adresse von main () bestimmen, die Sie für Ihren Befehl "go" verwenden.
Ich arbeite jeden Tag mit dem ARM non-os non-lib. Dies sind meine aktuellen gcc-Optionen:
arm-was-auch-gcc -Wand -O2 -nostdlib -nostartfiles -freestanding -c hallo.c -o hallo.o
Dann benutze ich den Linker, um den C-Code mit den Vektortabellen zu kombinieren und so, auch wenn es kein Bild ist, das eine Vektortabelle mit einer Vektortabelle benötigt, ist es einfach, Ihren Einstiegspunkt auf die erste Anweisung zu setzen / p>
Gibt es einen Grund, warum Sie nicht mindestens die Standardbibliotheken statisch verknüpfen können? Sie sollten ein Arbeitsprogramm und die Vorteile der Standardbibliotheken ohne externe Abhängigkeiten haben.
Unterscheidet Ihre Toolchain / IDE auch zwischen "Standalone-Anwendung" und "Linux-Anwendung"? Die IDE für den AVR32 hat diese Unterscheidung und kann entweder ein Programm erzeugen, das innerhalb der eingebetteten Linux-Umgebung läuft oder ein eigenständiges Programm, das im Grunde zum Betriebssystem wird.
Tags und Links c gcc embedded arm bootloader