将文件链接到内核时出错
我有问题。我已经编译了文件 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
也许-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.
您正在使用编译器和工具链来生成 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.