Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: jgraef am 03. June 2008, 16:12
-
Hi,
Um Programme für meinOS zu linken benutze ich folgenden Befehl:
$ ld -o init init.o -T../link.ld -L../lib -lc -lmeinos -lgcc
Dabei bekomme ich folgende Fehlermeldung:
ld: warning: cannot find entry symbol _start; defaulting to 0000000000002000
Mein Problem ist nun, dass ich nicht weiß warum er _start nicht findet obwohl ich die entsprechende Datei dazulinke (ist in libc enthalten). Hier der Beweis:
$ nm libc.a | grep _start
00000000 T _start
-
Hiho
So wie ich das aus der ld hilfe herauslese, gibst du mit der Option "-l" den Name der Bibliothek an, die geladen werden soll.
Da du aber nirgends die libc aufführst, wird diese wahrscheinlich auch nicht verwendet.
Probiere das ganze mal zusätzlich mit der Option -llibc, also folgendes:
ld -o init init.o -T../link.ld -L../lib -lc -lmeinos -lgcc -llibc
Gruß Christian
-
Er gibt libc an mit -lc.
@jgraef
Das Problem kannste möglicherweise durch Umordnung/Mehrfachnennung der Libraries lösen oder aber einfach durch ein Umschließen mit --start-group ... --end-group:
ld -o init init.o -T../link.ld -L../lib --start-group -lc -lmeinos -lgcc --end-group
-
Weder:
$ ld -o init init.o -T../link.ld -L../lib --start-group -lc -lmeinos -lgcc --end-group
noch:
$ ld -o init init.o -lc -T../link.ld -L../lib -lc -lmeinos -lgcc
oder:
$ ld -o init init.o -lc -T../link.ld -L../lib --start-group -lc -lmeinos -lgcc --end-group
oder:
$ ld -o init init.o --start-group -lc -lmeinos -lgcc --end-group -T../link.ld -L../lib
bringt etwas. Immer noch gleiche Fehlermeldung.
-
Könnte es sein, dass er die Host-libc nimmt und nicht deine eigene?
-
Hi,
Ich benutze einen Crosscompiler und -nostdlib bringt auch keine Besserung.
-
Also so wie ich ld hier vor mit habe (mit Cygwin) sollte da ein Leerzeichen zwischen das -l und den Biblitheksname.
(Eine mögliche Ursache)
z.B.:
$ ld -o init init.o -lc -T../link.ld -L../lib -l c -l meinos -l gcc
Gruß Christian
PS: Ging das vorher die ganze Zeit so, oder hast du das vorher anders gelinkt?
-
Also so wie ich ld hier vor mit habe (mit Cygwin) sollte da ein Leerzeichen zwischen das -l und den Biblitheksname.
Nicht wirklich, siehe auch LD manual (http://sourceware.org/binutils/docs/ld/Options.html#Options).
Ich denke eher, dass LD das Symbol nicht einbindet, weil es zu der Zeit zu der die .a durchsucht wird noch überhaupt nicht gebraucht wird...
edit: Ach richtig, in #lost haben wir darüber geredet und sind bis jetzt nur auf die Lösung gekommen, die Datei mit dem _start Symbol extra an ld zu übergeben (und aus der .a rausnehmen).