将文件链接到内核时出错

Error in linking files into a kernel

本文关键字:出错 内核 文件 链接      更新时间:2023-10-16

我有问题。我已经编译了文件boot.o:

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

和编译后的c++文件main.o:

 int main(){
//processes
}

我使用这个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*)
}

}所以我想开始链接,我在windows上使用g++,我在cmd: ld -T linker.ld -o kernle.bin main.o boot.o中使用这个命令。并拒绝我错误:ld: cannot preform PE operations on non PE output file kernel.bin。有人知道怎么修理吗?

可能是-oformat bin?

我怀疑你是否能够启动它,无论如何…去阅读一些引导程序教程(在osdev.org和brokenthorn.com上),你会得到一个答案。

您正在使用编译器和工具链来生成windows可执行文件,而不是普通的二进制文件。您需要一个用于内核开发的交叉编译器。此外,您还需要一个引导加载程序,一个内核,即使是最小的,也无法容纳512字节的引导扇区。如果我说错了请指正,但你似乎根本不懂电脑的操作程序。我建议从http://wiki.osdev.org/开始。