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

时间:2015-01-01 19:34:07

标签: c assembly linker

我正在尝试从我的汇编文件内核阶段转到我的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 :(得分:0)

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

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

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