GCC library für printf

OP #4898642
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.
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.
Persönliche Seite
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 ;-)
OP
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?
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.