【问题标题】:Linking kernel - i386 architecture of input file is incompatible with i386:x86_64 output链接内核 - 输入文件的 i386 架构与 i386:x86_64 输出不兼容
【发布时间】:2015-01-01 19:34:07
【问题描述】:

我正在尝试从我的汇编文件内核阶段转到我的 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 位上运行。提前感谢您提供的任何帮助。

【问题讨论】:

  • 您是否尝试过告诉gccld 生成32 位代码? (默认情况下,在 64 位系统上,他们会想要制作 64 位二进制文​​件。)

标签: c assembly linker


【解决方案1】:

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

由于您没有任何代码可以让系统进入长模式,您可能希望将“内核”编译为 32 位代码。使用-m32 触发:

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

【讨论】:

    猜你喜欢
    • 2013-10-12
    • 2019-01-18
    • 2011-10-25
    • 2011-07-04
    • 2020-06-18
    • 2013-01-17
    • 2015-09-30
    • 1970-01-01
    • 2015-01-19
    相关资源
    最近更新 更多