将文件链接到内核时出错

时间:2011-07-28 06:18:30

标签: c++ assembly linker operating-system kernel

我有问题。我编译了文件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。有谁知道我该如何修理它?请帮帮我。

2 个答案:

答案 0 :(得分:0)

也许-oformat bin?

我怀疑你能够启动它,无论如何......去阅读一些bootloader教程(在osdev.org和brokenthorn.com上),你会得到答案的原因。

答案 1 :(得分:0)

您正在使用编译器和工具链来构建Windows可执行文件,而不是平面二进制文件。您需要一个用于内核开发的交叉编译器。此外,您将需要一个引导加载程序,一个内核,即使是最小的,也不能适应512字节的bootsector。 如果我错了,请纠正我,但你似乎根本不理解电脑的机器人过程。我建议先阅读http://wiki.osdev.org/作为开头。