【发布时间】:2013-08-10 20:08:22
【问题描述】:
我正在尝试链接到文件 - 一个包含 main 函数的 c 文件和一个简单地跳转到 main 的 asm 文件。
我已经安装了mingw。 我的文件:
//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 $
我调用构建的命令:
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
当我尝试使用 -r 运行 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 不断重启。
【问题讨论】:
-
你试过
extern _main, call _main吗? -
修复了第一个错误,kernel.c 中的第二个错误仍然存在