我正在尝试从我的汇编文件内核阶段转到我的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警告但是现在它似乎并不重要(尽管如果你提供任何帮助在这方面,也将受到赞赏。
有谁能告诉我为什么我不能将这些文件链接在一起?我也在64位Ubuntu dekstop上运行。提前感谢您提供任何帮助。
答案 0 :(得分:0)
看起来您正在64位系统上编译此代码。因此,kernel.o
是64位二进制文件,不能与32位kernel_entry.o
链接。
由于您没有任何代码可以使系统进入长模式,因此您可能希望编译"内核"作为32位代码。使用-m32
来触发此操作:
gcc -m32 -ffreestanding -c kernel.c -o kernel.o
^^^^