gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:42:00 24 4
gpt4 key购买 nike

我正在尝试从我的汇编文件内核阶段转移到我的 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
^^^^

关于c - 链接内核 - 输入文件的 i386 架构与 i386 :x86_64 output 不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27733964/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com