首页 文章

链接内核 - 输入文件的i386架构与i386:x86_64输出不兼容

提问于
浏览
0

我试图从我的汇编文件内核阶段继续到我的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上运行 . 提前感谢您提供的任何帮助 .

1 回答

  • 0

    看起来好像是在64位系统上编译这段代码 . 因此, kernel.o 是64位二进制文件,不能与32位 kernel_entry.o 链接 .

    由于您没有任何代码可以使系统进入长模式,因此您可能希望将"kernel"编译为32位代码 . 使用 -m32 来触发:

    gcc -m32 -ffreestanding -c kernel.c -o kernel.o
        ^^^^
    

相关问题