Forum: Compiler & IDEs GCC library für printf


von Martin O. (ossi-2)


Lesenswert?

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
von Markus F. (mfro)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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 ;-)

von Martin O. (ossi-2)


Lesenswert?

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
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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
von Klaus Falser (Gast)


Lesenswert?

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.

von Klaus Falser (Gast)


Lesenswert?

Hab mich getäuscht, das Tool heißt libgen.
Platgen ist für die Hardware.

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
Noch kein Account? Hier anmelden.