0
我正試圖從我的程序集文件內核階段繼續到我的C文件內核階段(最後...)。但是,在將我編譯的C內核鏈接到我編譯的彙編內核入口程序的過程中,我遇到了一些麻煩。鏈接內核 - 輸入文件的i386體系結構與i386不兼容:x86_64輸出
這是我的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,我不清楚爲什麼第2個ld警告顯示,但現在看來並不重要(儘管如果你在這方面提供任何幫助,我們將不勝感激)。
誰能告訴我爲什麼我不能將這些文件鏈接在一起?我也在Ubuntu dekstop 64位上運行。提前感謝您提供的任何幫助。
您是否嘗試告訴'gcc'和'ld'生成32位代碼? (默認情況下,在64位系統上,他們需要創建64位二進制文件。) – cHao