2015-01-01 52 views
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位上運行。提前感謝您提供的任何幫助。

+0

您是否嘗試告訴'gcc'和'ld'生成32位代碼? (默認情況下,在64位系統上,他們需要創建64位二進制文​​件。) – cHao

回答

0

它看起來好像是在64位系統上編譯此代碼。因此,kernel.o是一個64位二進制文​​件,不能與32位kernel_entry.o鏈接。

由於您沒有任何代碼讓系統進入長時間模式,您可能需要將「內核」編譯爲32位代碼。使用-m32來觸發此操作:

gcc -m32 -ffreestanding -c kernel.c -o kernel.o 
    ^^^^ 
相關問題