Forum: Compiler & IDEs arm-none-eabi Linker problem


von guest (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Unbe Darfter (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Deinen kurzen Schnipsel
> hättest Du auch in [ pre ] [ /pre ] - Tags direkt in Dein Posting
> einbinden können.

Nebenfrage: wo findet man eine Zusammenfassung aller möglichen
Steuerzeichen/SteuerTokens/Einbettungsoptionen?

von guest (Gast)


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, ...)

von Johann L. (gjlayde) Benutzerseite


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.

: Bearbeitet durch User
von Dr. Sommer (Gast)


Lesenswert?

Das Ganze ist übrigens unter ARM GCC erläutert.

von Rufus Τ. F. (rufus) Benutzerseite


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.

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.