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


von Tilo (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Ich habe ein kleines Problem mit meiner Makefile.
Folgender Code erzeugt einen Fehler:
1
    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

von Martin Thomas (Gast)


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.

von Tilo (Gast)


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?

von Tilo (Gast)


Lesenswert?

Nachtrag:

Ich habe die Funktion in lib/gcc/arm-elf/4.2.2/include/ssp/string.h
gefunden. string.h wird mit
1
#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.

von Martin Thomas (Gast)


Lesenswert?

Ohne jetzt zu weit ausholen zu wollen: Das Makefile im Projekt 
http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/ADuC7020_pulse_20071205.zip 
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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Tilo (Gast)


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.

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.