我有问题。我编译了文件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
。有谁知道我该如何修理它?请帮帮我。
答案 0 :(得分:0)
也许-oformat bin?
我怀疑你能够启动它,无论如何......去阅读一些bootloader教程(在osdev.org和brokenthorn.com上),你会得到答案的原因。
答案 1 :(得分:0)
您正在使用编译器和工具链来构建Windows可执行文件,而不是平面二进制文件。您需要一个用于内核开发的交叉编译器。此外,您将需要一个引导加载程序,一个内核,即使是最小的,也不能适应512字节的bootsector。 如果我错了,请纠正我,但你似乎根本不理解电脑的机器人过程。我建议先阅读http://wiki.osdev.org/作为开头。