2009-04-21 6 views
0

Ich habe eine Assembly-Datei und eine c-Datei kompiliert zu .o-Dateien (start.o und main.o) und versucht, sie mit ld zu verknüpfen. Ich verwende diesen Befehl ein:ld kann keine c-Datei finden

ld -T link.ld -o kernel.bin start.o main.o 

wo link.ld eine Linker-Skript ist, aber wenn ich es laufen lasse, erhalte ich diese Fehlermeldung:

start.o:start.o:(.text+0x2d): undefined reference to `_main' 

in der Baugruppendatei, nenne ich die c Datei mit dieser Funktion:

stublet: 
extern _main 
call _main 

jmp $ 

Jeder kann sehen, was los ist?

+0

Für was ist das Linker-Skript? – pjc50

+0

@ pjc50 Dieser Code sieht so aus, als würde ich jetzt arbeiten. Ein Tutorial zur grundlegenden Kernel-Entwicklung. http://www.osdever.net/bkerndev/Docs/creatingmain.htm Für die relevante Seite. – Chris

Antwort

3

Einige Compiler (wie GCC für Linux) fügen _ nicht standardmäßig C-Bibliotheksexporten hinzu. Versuchen Sie nm main.o, um den tatsächlichen Referenznamen zu sehen. Es könnte main eher als _main sein.

0

Einige Linker reagieren empfindlich auf die Reihenfolge, in der Objektdateien oder Bibliotheken in der Befehlszeile angezeigt werden - versuchen Sie, die Reihenfolge der beiden Objektdateien zu vertauschen.

Ich sollte auch darauf hinweisen, dass der C-Standard keine Garantie dafür gibt, dass main() eine Funktion ist - tatsächlich ist es C-Programmen ausdrücklich untersagt, main anzurufen.