arm-none-eabi Linker problem

Gast #5080590
Lesenswert?
• ▲
▼
Ich habe ein Problem bein kompilieren eines einfachen Testprograms mit 
arm-none-eabi-gcc

Das ganze klappt einwandfrei solange ich nicht versuche Funktionen aus 
externen Libraries zu nutzen. Der include selbst wird nicht als Fehler 
gemeldet.

http://lpaste.net/356983

Dort sieht man den kurzen Quellcode + Makefile + consolen output

Das Problem tritt in Zeile 36 auf.
Persönliche Seite #5080711
Lesenswert?
• ▲
▼
Wenn Du Funktionen aus Libraries verwenden willst, musst Du auch mit den 
Libraries linken.

Die Arduino-Schöpfer haben ärgerlicherweise die idiotische Idee gehabt, 
Headerdateien (*.h) als "Library" zu bezeichnen, das ist falsch und 
irreführend, wie Du gerade selbst festgestellt hast.

Um eine Library (das ist eine Sammlung von bereits compiliertem 
Sourcecode, bei gcc sind das Dateien namens lib*.a) zu benutzen, genügt 
es nicht, die Headerdatei einzubinden, die deklariert, was in der 
Library vorhanden ist, sondern man muss seinem Compiler die Library als 
Linkeroption mitteilen.

Bei gcc erfolgt das mit der Kommandozeilenoption -l

Um eine Library wie z.B. libirgendwas.a zu verarbeiten, lautet die 
Kommandozeilenoption -lirgendwas.

Du hast bei Deinem Linkeraufruf explizit das Verwenden der 
Standardlibrary unterbunden: -nostdlib


Abschließend:

So etwas wie "paste.net" bitte nicht benutzen. Dieses Forum bietet 
selbst die Möglichkeit, Dateien anzuhängen; Deinen kurzen Schnipsel 
hättest Du auch in [ pre ] [ /pre ] - Tags direkt in Dein Posting 
einbinden können.
Gast #5080740
Lesenswert?
• ▲
▼
Danke das du reingeguckt hast.
1
int main(void)
2
{
3
  char ary[5];
4
  sprintf(ary,"%s",ary);
5
  return 0;
6
}
1
ARMGNU = arm-none-eabi
2

3
ARCH = -mcpu=cortex-m4
4
AOPS = --warn --fatal-warnings
5
COPS = -Wall -O2 -nostdlib -nostartfiles -ffreestanding -mthumb -std=c99 -mfloat-abi=soft
6

7
gcc : main.gcc.thumb2.flash.bin
8

9
all : gcc
10

11
main.gcc.thumb2.flash.bin: main.c
12
  $(ARMGNU)-gcc $(COPS) $(ARCH) main.c -I/usr/arm-none-eabi/include/ -L/usr/arm-none-eabi/lib/thumb/

1
arm-none-eabi-gcc -Wall -O2 -nostdlib -nostartfiles -ffreestanding -mthumb -std=c99 -mfloat-abi=soft -mcpu=cortex-m4 main.c -I/usr/arm-none-eabi/include/ -L/usr/arm-none-eabi/lib/thumb/
2
/usr/lib/gcc/arm-none-eabi/7.1.0/../../../../arm-none-eabi/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000008000
3
/tmp/cc6fDBq0.o: In function `main':
4
main.c:(.text.startup+0xa): undefined reference to `sprintf'
5
collect2: error: ld returned 1 exit status
6
make: *** [Makefile:31: main.gcc.thumb2.flash.bin] Error 1


Ich habe ein paar Aenderungen gemacht. Es fehlt immer noch das -l flag, 
weil ich nicht weiss welche library eigentlich die richtige ist. -lgcc 
z.b. hat nicht zum erfolg gefuehrt.

grep -E "*sprintf*" hat auf jedenfall das vorhanden sein der Funktion in 
einer der headerfiles bestaetigt.
1
/usr/arm-none-eabi/include/stdio.h:int  _EXFUN(sprintf, (char *__restrict, const char *__restrict, ...)
Persönliche Seite #5080753
Lesenswert?
• ▲
▼
guest schrieb:
> Es fehlt immer noch das -l flag, weil ich nicht weiss welche library
> eigentlich die richtige ist.

Der Compiler weiß es.  Was soll das -nostdlib ?

Selbst wenn das Linken funktioniert kann es sein, dass du die falsche 
Lib-Ausprägung erwischst.

Standard-Bibliotheken und -Header finden die Tools von alleine wenn du 
sie nur lässt.  Falls nicht, ist deine Toolchain kaputt.  Besorg dir 
dann eine vernünftige.

> -lgcc z.b. hat nicht zum erfolg gefuehrt.

Dein Beispiel sollte ohne -I, -L, -l und -nostdlib funktionieren, d.h. 
Compilieren und Linken ohne diesen Trallala.  Außerdem willst du 
ziemlich sicher nicht -ffreestanding.

> warning: cannot find entry symbol _start

wohl wegen -nostartfiles.  Du brauchst dann einen eigenen Startup-Code, 
der zudem noch zu deinem Linker-Skript passen muss.
Persönliche Seite #5080956
Lesenswert?
• ▲
▼
Unbe Darfter schrieb:
> Nebenfrage: wo findet man eine Zusammenfassung aller möglichen
> Steuerzeichen/SteuerTokens/Einbettungsoptionen?

Sieh Dir mal den grauen Kasten an, den das Forum rund um das 
Texteingabefeld darstellt, hier den Text zwischen "Antwort schreiben" 
und dem Texteingabefeld. Der in Klammern stehende Text "mehr 
Informationen..." ist ein anklickbarer Link.

Antwort schreiben

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.

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.