Forum: Compiler & IDEs crosstool-ng undefined reference


von Stefan A. (king-crash)


Lesenswert?

Hallo,

ich habe mit crosstool-ng eine Toolchain für Cortex-M0 gebaut. Das hat 
in der Vergangenheit auch schon funktioniert, nur dieses mal scheint der 
Linker nicht richtig zu funktionieren. Selbst beim Kompilieren einer 
leeren main Funktion (Aufruf "arm-cortexm0plus-eabi-gcc -v -Wall -o test 
test.c -Wl,--verbose") wird uA "undefined reference to `memset'" 
bemängelt.

Die libc scheint er aber zu laden:
attempt to open 
/toolchains/arm-cortexm0plus-eabi/lib/gcc/arm-cortexm0plus-eabi/13.2.0/. 
./../../../arm-cortexm0plus-eabi/lib/libc.a  succeeded

nm zeigt auch diverse Symbole mit dem Namen "memcpy" in dieser Datei.


Hat jemand eine Idee warum der Linker die Funktion nicht findet?

von Jim M. (turboj)


Lesenswert?

Memset ist Teil der LibC, und der Compiler kann die neuerdings auch via 
Optimizer aufrufen IIRC.

Der Startup Code enthält normalerweise eine Schleife die das BSS auf 
Null setzt, da könnte der Optimizer ein memset() generieren.

Schau Dir mal den Assembler Code an (--save-temps=obj -fverbose-asm).

Der Startup Code ist normalerweise spezifisch auf den µC zugeschnitten, 
da dort auch die Vektortabelle drin steht.

Ich erinnere mich dunkel das einige Linker hier die Libs explizit haben 
wollten (-lm -lc -lgcc). Die fehlen bei Dir oben.

Ist Dir eigentlich klar das die gepostete Kommandozeile sowohl den 
Compiler als auch den Linker aufruft? Ich frage das weil man das 
abändern muss sobald das Projekt mehr als ein C/ASM Source File hat.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Stefan A. schrieb:
> -o test

Übel wenn man "." im Pfad hat (was man nicht haben sollte).

"test" ist ein Shell Befehl, wenn aber stattdessen das erzeugte "test" 
genommen wird...

Zum Problem: Evtl gibt ein Map File mehr Aufschluss: -Wl,-Map,datei.map

Jim M. schrieb:
> Ich erinnere mich dunkel das einige Linker hier die Libs explizit haben
> wollten (-lm -lc -lgcc). Die fehlen bei Dir oben.

Sollte eigentlich der Compiler(-Treiber) richtig machen. Wenn hier die 
libgcc ein Symbol aus libc referenziert hat man ein Problem; richtig 
wäre dann sowas wie
1
--start-group -lm -lc -lgcc --end-group
und evtl. mit Startup Code in der Gruppe.

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.