mikrocontroller.net

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


Autor: guest (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht 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.

Autor: Unbe Darfter (Gast)
Datum:

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

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke das du reingeguckt hast.
int main(void)
{
  char ary[5];
  sprintf(ary,"%s",ary);
  return 0;
}


ARMGNU = arm-none-eabi

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

gcc : main.gcc.thumb2.flash.bin

all : gcc

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



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/
/usr/lib/gcc/arm-none-eabi/7.1.0/../../../../arm-none-eabi/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000008000
/tmp/cc6fDBq0.o: In function `main':
main.c:(.text.startup+0xa): undefined reference to `sprintf'
collect2: error: ld returned 1 exit status
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.
/usr/arm-none-eabi/include/stdio.h:int  _EXFUN(sprintf, (char *__restrict, const char *__restrict, ...)

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Dr. Sommer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Ganze ist übrigens unter ARM GCC erläutert.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.

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