mikrocontroller.net

Forum: Compiler & IDEs gnuarm - Probleme mit Linker / Makefile


Autor: Tilo L. (katagia)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich habe ein kleines Problem mit meiner Makefile.
Folgender Code erzeugt einen Fehler:
    unsigned char cmd7[] = { 0x11, 0x22 };

arm-elf-ld -v -lm -lc -Map main.map -Taduc-ram.cmd -o main.out crt.o 
irq.o main.o  libgcc.a
main.o: In function `mmc_write_sector':
/Users/tilolutz/Documents/workspace/MMC_Demo/main.c:185: undefined 
reference to `memcpy'

Ich habe ein wenig gegoogelt und herausgefunden, dass man dem
Linker den Parameter "-lgcc" mitgeben muss.

Das ist jetzt der Punkt, an dem ich nicht mehr weiter komme.
Ich habe für einen ADUC die Makefile des Tutorial für den
AT91SAM7S angepasst. In dieser Makefile wird "arm-elf-ld" direkt
aufgerufen. "arm-elf-ld" kann mit diesem Parameter aber nichts 
angefangen.

Ich habe eine andere Makefile, die für mich völlig anders aufgebaut ist.
Hier wird "arm-elf-gcc" als Linker verwendet. Dort gibt es mit dem 
Parameter
"-lgcc" auch keine Probleme.


Ich bin ein wenig verwirrt was jetzt genau falsch ist bzw. was der 
Unterschied ist?
Ich kenne mich mit dem Compiler leider noch nicht so gut aus.

Ich habe beide Makefiles angehängt.

Vielen Dank,

Tilo

Autor: Martin Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist eigentlich nichts "falsch". Empfohlen wird (nicht nur von mir) 
der Aufruf über das Compiler-Frontend (also arm-*-gcc). Einen der 
Gründe, womöglicher den praktischsten, schon gefunden: das 
Compiler-Frontend weiss wo "seine" libgcc.a (das was mit -lgcc gemeint 
ist) zu finden ist (bei ARM evtl. mehrere wg. "multilib"). Der Linker 
(arm-*-ld) findet diese erst, wenn man explizit per Pfad darauf 
hinstößt.

Autor: Tilo L. (katagia)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Info.

Ich habe mich schon gewundert, warum die libgcc.a von Hand in das
Verzeichnis kopiert werden müsste. Was mir dann nur unklar ist:
ist memcpy nicht eine
Funktion aus libgcc.a? Ich habe die lbgcc.a von gnuarm in das
Projektverzeichnis kopiert. Dort ist diese Funktion aber nicht dabei.
Hätte ich beim kompilieren von gcc das irgend wie mit angeben müssen?

Zurück zum dem Thema, das du angesprochen hast.
Der Linker wird in der Makefile ohne "-lgcc" so ausgeführt:
  $(LD) $(LFLAGS) -o main.out $(OBJECTS) libgcc.a

Diese Zeile muss angepasst werden, wenn man das Compiler Frontend 
verwenden will.
Dies müsste dann für arm-elf-gcc so aussehen:
  $(CC) $(CFLAGS) $(OBJECTS) libgcc.a --output $@ $(LFLAGS)

Leider scheint das totaler Blödsinn zu sein:
arm-elf-gcc -I./ -c -fno-common -mcpu=arm7tdmi -O0 -g crt.o irq.o main.o 
libgcc.a --output main.out -lm -lc -Map main.map -Taduc-ram.cmd
arm-elf-gcc: main.map: No such file or directory
arm-elf-gcc: unrecognized option '-Map'
make: *** [main.out] Error 1


Klar, laut man-page gibt es so einen Parameter auch nicht. In der 
anderen
Makefile wird er aber benutzt? Wie geht das?

Autor: Tilo L. (katagia)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:

Ich habe die Funktion in lib/gcc/arm-elf/4.2.2/include/ssp/string.h
gefunden. string.h wird mit
#include <string.h>

eingebunden. Die Datei wird wohl auch gefunden, wenn ich einen 
ungültigen
Namen verwende, erhalte ich einen Fehler. Ich denke, der Fehler ist
vermutlich, dass der Linker nicht weiß, wo er suchen soll :(
Damit wären wir wieder beim Ausgangsproblem.

Autor: Martin Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne jetzt zu weit ausholen zu wollen: Das Makefile im Projekt 
http://www.siwawi.arubi.uni-kl.de/avr_projects/arm... 
basiert auf meiner aktuellen Vorlage. Vielleicht findet sich da ein 
wenig "Inspiration". Ansonsten ein Päckchen zippen mit Makefile, 
startup-code, linker-script und genug Quellcode, um das Problem 
reproduzieren zu können.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Problem besteht übrigens darin, dass du die Bibliotheken angibst,
bevor du deine Objektdateien angibst.  Damit wird aus den Bibliotheken
nichts benötigt zu diesem Zeitpunkt.

Autor: Tilo L. (katagia)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Martin:

Das Projekt habe ich mir gestern Abend noch heruntergeladen.
Allerdings ist die Makefile so komplex, dass ich als Anfänger eine
ganze Weile brauche, um zu verstehen, was die ganzen Parameter machen.

Desshalb habe ich mit einer "einfachen" Makefile angefangen, die ich
dann selbst ergänze.


@Jörg:

Genau das war es:
  $(LD)  -o main.out $(OBJECTS) $(LFLAGS)
Einfach die Variable LFLAGS nach hintern verschoben und siehe da
- es geht.

Danke für eure Hilfe. Ich denke ich sollte mich doch ein wenig mehr
in den gcc einarbeiten.

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