2011-07-28 61 views
2

我有問題。我已編譯的文件boot.o:將文件鏈接到內核時出錯

[BITS 16] 
[ORG 0x7C00] 
[global start] 
[extern _main] 
start: 
call _main 
cli 
hlt 

和編譯的C++文件main.o:使用

int main(){ 
//processes 
} 

林本LD文件linker.ld用於鏈接:

OUTPUT_FORMAT("binary") 
ENTRY(start) 
SECTIONS 
{ 
. = 0x100000; 

.text ALIGN(4096) : 
{ 
    *(.text*) 
    *(.gnu.linkonce.t*) 
} 

.rodata ALIGN(4096) : 
{ 
    start_ctors = .; 
    *(.ctor*) 
    end_ctors = .; 

    start_dtors = .; 
    *(.dtor*) 
    end_dtors = .; 

    *(.rodata*) 
    *(.gnu.linkonce.r*) 
} 

.data ALIGN(4096) : 
{ 
    *(.data*) 
    *(.gnu.linkonce.d*) 
} 

.bss ALIGN(4096) : 
{ 
    *(.COMMON*) 
    *(.bss*) 
    *(.gnu.linkonce.b*) 
} 

} 所以我想開始鏈接,並且我正在使用g ++ for windows,並且我在cmd中使用這個命令:ld -T linker.ld -o kernle.bin main.o boot.o。並拒絕我錯誤:ld: cannot preform PE operations on non PE output file kernel.bin。有誰知道我該如何修復它?請幫幫我。

回答

0

也許-oformat bin?

我懷疑你將能夠啓動它,無論如何...去閱讀一些引導裝載程序教程(在osdev.org和brokenthorn.com),你會得到一個答案爲什麼。

+0

這我有形式osdever。 – FrewCen

+0

你永遠不會讓你的C++內核適合512字節(引導扇區),你將無法在16位實模式下運行它(處理器在啓動時工作)等等。我建議閱讀[入門](http://wiki.osdev.org/Getting_Started),[引導順序](http://wiki.osdev.org/Boot_sequence)和[Bootloader](http://wiki.osdev .org/Bootloader)在osdev.org維基上的文章(以...開頭)。 – Griwes

0

您正在使用一個編譯器和工具鏈來構建Windows可執行文件,而不是平面二進制文件。你需要一個交叉編譯器來進行內核開發。此外,你將需要一個引導程序,一個內核,甚至是最小的,不能放入512字節的引導扇區。 糾正我,如果我錯了,但你似乎並沒有理解一個電腦的機器人程序。我建議讀取http://wiki.osdev.org/作爲開始。