Ich benutze derzeite den GCC Compiler für den microblaze Softcore von XILINX. Vieles geht auch schon. Ich kann einfache Programme compilieren, linken (mit libgcc) und laufen lassen, sowohl simuliert als auch auf dem FPGA softcore. Jetzt möchte ich mal die Bibliotheksfunktion printf benutzen (zu Testzwecken, nicht weils wirklich sinnvoll ist!). Da stosse ich auf ein Problem. Wenn ich mein Programm mit dem gcc in einem Schritt compliliere und linke gcc ....... findet der gcc die printf Funktion scheinbar. Ich möchte aber getrennt compilieren und linken (mit eigenem Linkerscript und startup code), also gcc -c ...... compilieren mb-ld ...... linken da findet der linker ld aber keine printf Funktion. Wie bekomme ich raus, woher der gcc die printf-Funktion bekommt. Wie sage ich diese Quelle dann dem mb-ld ? ok, eine Möglichkeit ist, alle notwendigen Linker Optionen beim gcc Aufruf mit anzugeben. Aber nen getrennter Linker-Lauf würd mir halt besser gefallen.
:
Bearbeitet durch User
Martin O. schrieb: > Wie bekomme ich raus, woher der gcc die printf-Funktion bekommt. > Wie sage ich diese Quelle dann dem mb-ld ? Das steht in deinem Map-File (wenn Du dir eins anlegen läßt).
1 | xxx-xxx-gcc -Wl,-Map -Wl,mapfile |
Die gefundene Library muß dann mit in den Linker-Aufruf. Wesentlich einfacher geht das, wenn Du nicht direkt den Linker aufrufst, sondern das durch den gcc erledigen läßt.
Martin O. schrieb: > Wenn ich mein Programm mit dem gcc in einem Schritt compliliere und > linke > gcc ....... > findet der gcc die printf Funktion scheinbar. Ich möchte aber getrennt > compilieren und linken (mit eigenem Linkerscript und startup code), also > gcc -c ...... compilieren > mb-ld ...... linken > da findet der linker ld aber keine printf Funktion. Du nimmst bei der zweiten Variante im Gegensatz zur ersten ld statt gcc zum Linken. Das führt dazu, dass die ganzen notwendigen Standard-Paramter nicht automatisch an den Linker weitergegeben werden - unter anderem das Linken der libc, in der printf enthalten ist. Entweder musst du die Parameter also von Hand alle korrekt angeben, oder einfach gcc zum Linken nehmen. > ok, eine Möglichkeit ist, alle notwendigen Linker Optionen beim gcc > Aufruf mit anzugeben. Aber nen getrennter Linker-Lauf würd mir halt > besser gefallen. Du kannst den getrennten Linker-Lauf ja trotzdem über gcc machen.
Martin O. schrieb: > Wenn ich mein Programm mit dem gcc in einem Schritt compliliere und > linke gcc ... findet der gcc die printf Funktion scheinbar. scheinbar? > Ich möchte aber getrennt compilieren und linken (mit eigenem > Linkerscript und startup code), Auch wenn nicht "getrennt" Compiliert und Gelinkt wird, können eigenes Linker-Description-File und eigene Module wie Start-Code verwendet werden. Compilieren, Assemblieren und Linken sind immer separate Schtritte — zumindest bei den GNU-Tools. > gcc -c ...... compilieren > mb-ld ...... linken > da findet der linker ld aber keine printf Funktion. Der Linker findet in den Verzeichnissen, die ihm mitgegeben werden. Das ist ziemlich mühsam und fehleranfällig, und oft gibt es keinen Grund außer Unwissenheit, den Linker von Hand aufzurufen anstatt mb-gcc als Linker-Treiber arbeiten zu lassen. Gib einfach mal mb-gcc -v -Wl,-v zum Linken und Compilieren an (ohne -c) und schau die Ausgabe an: Das willst du garantiert nicht von Hand nachbasteln, insbesondere die Multilibs oder Durchreichen von Optionen bei LTO! > Wie bekomme ich raus, woher der gcc die printf-Funktion bekommt. Verwende mb-gcc zum Linken. > Wie sage ich diese Quelle dann dem mb-ld ? Wenn es wirklich md-ld sein muss, mach dich erst mal mit der Struktur der Toolchain vertraut: - Wie ist die Multilib-Striktur? - Wo liegen die gcc-eigenen Bibliotheken wie libgcc? - Wo liegen die Standard-Bibliotheken wie libc und libm? - Wie werden Pfade uznd Module für LTO weitergereicht? - Wie ist die Header-Struktur? (auch Header können Multilib-Struktur aufweisen, ist abhängig von der Toolchain). Hab ich die passenden Header verwendet? > ok, eine Möglichkeit ist, alle notwendigen Linker Optionen beim gcc > Aufruf mit anzugeben. Aber nen getrennter Linker-Lauf würd mir halt > besser gefallen. Die Schönheit... wer schön sein will muss eben leiden ;-)
Besten Dank für eure Antworten. So langsam erreiche ich was ich will. Momentane Variante ist das Durchreichen meiner linker-optionen durch den gcc-Aufruf hindurch. Dann werden auch Funktionen aus der libm.a gefunden. Das Problem bei mir ist, dass die "Umgebung" ziemlich "Nicht Standard" ist, weil ich z.B. den Code passend für meine microblaze-Hardware/Software erzeugen muss. Hat von euch zufällig jemand Erfahrung mit dem microblaze-Softcore?
:
Bearbeitet durch User
Wenn ich's recht sehe wird microblaze von den GNU-Tools unterstützt und ist auch in den Haupt-Entwicklungszweigen von GCC, Binutils, GDB und Newlib. Was ist denn daran "Nicht Standard"? Und was geht schief, wenn gcc als Linker(treiber) verwendet wird?
:
Bearbeitet durch User
Martin O. schrieb: > Hat von euch zufällig jemand Erfahrung mit dem microblaze-Softcore? Hier gibt es jede Menge Leute mit Microblaze Erfahrung, aber niemand sucht sich die Bibliotheken selbst zusammen. Xilinx liefert ein Tool, das nennt sich Platgen, und das bildet ein Verzeichnis mit allen Bibliotheken basierend auf deiner Microblaze Konfiguration.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.