过去,我在Visual Studio中创建了一个基本内核。这使得PE格式可执行,我的引导加载程序没有加载问题。我的引导加载程序将内核加载到0x100000,然后读取PE的“AddressofEntryPoint”字段,然后从那里继续执行。
我正在尝试使用Cygwin / GCC做同样的事情,但它似乎没有创建一个PE可执行文件。
如果我使用 gcc -o kernel.bin -c kernel.c -Wall -Wextra -Werror -nostdlib -nostartfiles -nodefaultlibs 这样的命令,由于 -c ,输出文件可启动。
但是,如果我首先尝试编译对象,然后进行链接,则可执行文件不再可启动。
i686-pc-cygwin-gcc-4 -c kernel.c -Wall -Wextra -Werror -nostdlib -nostartfiles -nodefaultlibs
ld kernel.o -o kernel.exe -T linker.ld
我可以使用第三方工具PE Explorer来分析Visual Studio所做的可执行文件,但是不能分析GCC输出的文件('错误,这不是exe或dll文件< / em>的')。
谁能看到我做错了什么?我已经在这方面工作了几天,它开始让我疯了!
这是我的链接器脚本:
ENTRY (_kmain)
OUTPUT_FORMAT("pe-i386")
SECTIONS
{
.text.start (0x100000) : {
kernel.o( .text )
}
.text : ALIGN(4096) {
_TEXT_START_ = .;
*(.text)
_TEXT_END_ = .;
}
.data : ALIGN(4096) {
_DATA_START_ = .;
*(.data)
_DATA_END_ = .;
}
.bss : ALIGN(4096) {
_BSS_START_ = .;
*(.bss)
_BSS_END_ = .;
}
}