对主ld的未定义引用

我试图链接到文件 – 包含一个主函数和一个简单地跳转到主的asm文件的交stream文件。

我已经安装了。 我的文件:

//kernel.c void some_function(){ } void main(){ char* video_memory = (char*) 0xb8000; *video_memory = 'X'; some_function(); } ;kernel_entry.asm [bits 32] [extern main] call main jmp $ 

我打电话build立的命令:

 gcc -ffreestanding -c kernel.c -o kernel.o nasm kernel_entry.asm -f elf -o kernel_entry.o ld -o kernel.bin -Ttext 0x1000 kernel_entry.o kernel.o 

我得到的错误:

 kernel_entry.o:(.text+0x1): undefined reference to `main' kernel.o:kernel.c:(.text+0xf): undefined reference to `__main' 

编辑:

哪些命令工作:

 ld -r -o kernel.out -Ttext 0x1000 kernel.o objcopy -O binary -j .text kernel.out kernel.bin 

当我尝试用-ri运行ld时出现错误:

 ld: Relocatable linking with relocations from format elf32-i386 (kernel_entry.o) to format pe-i386 (kernel.bin) is not supported 

编辑2:使用这些命令时,我得到了最好的结果:

 gcc -ffreestanding -c kernel.c -o kernel.o nasm kernel_entry.asm -f win32 -o kernel_entry.o ld -r -o kernel.out -Ttext 0x1000 kernel_entry.o kernel.o objcopy -O binary -j .text kernel.out kernel.bin 

文件链接成功,但运行时,主不会被调用。 也尝试过与coff格式,它也链接,但Bochs不断重新启动。

Solutions Collecting From Web of "对主ld的未定义引用"

第一个错误是因为在C中函数名为_name ,所以你不能调用main ,所以你必须调用_main 。 在TASM中你可以设置调用约定,所以assmebler自动可以调用正确的函数,我不知道是否对nasm也有这样的功能。

第二个问题可能是因为你直接调用链接器。 在这种情况下,您必须指定C启动模块,通常由编译器添加到链接器选项。 通常我认为这是一个类似crt0的文件。 如果你写自己的启动代码,你必须自己提供。 该模块从OS特定的入口点为C设置环境。 我想这在你的项目中是缺少的。

http://en.wikipedia.org/wiki/Crt0