Forum: Compiler & IDEs GCC library für printf


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Martin O. (ossi-2)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.