将文件链接到内核时出错

发布于 2024-11-26 15:11:36 字数 897 浏览 1 评论 0原文

我有问题。我已经编译了文件 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*)
}

} 所以我想开始链接,我在 Windows 上使用 g++,并且在 cmd 中使用以下命令:ld -T linker.ld -o kernle.bin main.o boot.o。并且拒绝我的错误:ld:无法对非 PE 输出文件 kernel.bin 执行 PE 操作。有人知道我该如何修复它吗?请帮我。

I have problem. I have compiled file boot.o:

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

and compiled C++ file main.o:

 int main(){
//processes
}

Im using this LD file linker.ld for linking:

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*)
}

}
So I want to start linking and I'm using g++ for windows, and I'm using this commands in cmd: ld -T linker.ld -o kernle.bin main.o boot.o. And is rejecting me error: ld: cannot preform PE operations on non PE output file kernel.bin. Does anybody know how can I repair it? Please help me.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

锦上情书 2024-12-03 15:11:36

也许-oformat bin?

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

Maybe -oformat bin?

And I doubt you will be able to boot it, anyway... Go read some bootloader tutorials (on osdev.org and brokenthorn.com) and you will get an answer why.

洛阳烟雨空心柳 2024-12-03 15:11:36

您正在使用编译器和工具链来生成 Windows 可执行文件,而不是平面二进制文件。您需要一个交叉编译器来进行内核开发。另外,您还需要一个引导加载程序、一个内核,即使是最小的,也无法放入 512 字节引导扇区。
如果我错了请纠正我,但你似乎根本不了解电脑的机器人流程。我建议阅读 http://wiki.osdev.org/ 作为开始。

You are using a compiler and toolchain built to make windows executables, not flat binaries. You need a cross compiler for kernel development. Also, you will need a bootloader, a kernel, even minimal, can't fit into the 512 byte bootsector.
Correct me if I'm wrong, but you don't seem to understand the bot process of a pc at all. I suggest reading http://wiki.osdev.org/ as a start.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文