【发布时间】: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 位上运行。提前感谢您提供的任何帮助。
【问题讨论】:
-
您是否尝试过告诉
gcc和ld生成32 位代码? (默认情况下,在 64 位系统上,他们会想要制作 64 位二进制文件。)