我正在尝试从汇编文件内核阶段转到C文件内核阶段(最终...)。但是,在将我的已编译C内核链接到我的已编译程序集内核入口程序的过程中遇到了一些麻烦。
这是我的kernel_entry.asm文件的代码。
[BITS 32] ; Starting in 32 bit protected mode
[EXTERN main] ; Extern to C file main function
call main ; Invoke main in our C kernel
jmp $ ; Jump here - Infinite loop
这是我的kernel.c文件的代码。
void main() {
char* video_memory = (char*) 0xB8000;
*video_memory = 'X';
}
这是我用来编译它们的命令行。
nasm -f elf -o kernel_entry.o kernel_entry.asm
gcc -ffreestanding -c kernel.c -o kernel.o
ld -o kernel.bin -Ttext 0x0500 kernel_entry.o kernel.o --oformat binary
最后一个命令行给了我这个错误。
ld: i386 architecture of input file `kernel_entry.o' is incompatible with i386:x86-64 output
ld: warning: cannot find entry symbol _start; defaulting to 0000000000000500
注意:我正在将内核加载到地址和偏移量0x0000:0x0500,这就是为什么我使用-Ttext 0x0500的原因,我不确定为什么会出现第二个ld警告,但目前看来似乎并不重要(尽管如果您在这方面提供了任何帮助,也将不胜感激)。
谁能告诉我为什么我不能将这些文件链接在一起?我也在Ubuntu dekstop 64位上运行。预先感谢您提供的任何帮助。
看来您是在64位系统上编译此代码。因此,kernel.o
它是64位二进制文件,不能与32位二进制文件链接kernel_entry.o
。
由于您没有任何代码可以使系统进入长模式,因此您可能希望将“内核”编译为32位代码。使用-m32
触发此:
gcc -m32 -ffreestanding -c kernel.c -o kernel.o
^^^^
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句