【问题标题】:Error in linking files into a kernel将文件链接到内核时出错
【发布时间】:2011-10-14 20:24:43
【问题描述】:

我有问题。我已经编译了 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: cannot preform PE operations on non PE output file kernel.bin。有谁知道我该如何修复它?请帮帮我。

【问题讨论】:

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


    【解决方案1】:

    也许是-oformat bin?

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

    【讨论】:

    • 你永远不会让你的 c++ 内核适应 512 字节(一个引导扇区),你将无法在 16 位实模式下运行它(处理器在引导时工作)等等。我建议阅读 osdev.org wiki 上的 Getting startedBoot sequenceBootloader 文章(以...开头)。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-14
      • 2021-02-01
      • 2020-10-18
      • 1970-01-01
      • 2019-09-29
      • 2012-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多