链接以使用Cygwin创建PE32可执行文件

时间:2013-04-28 02:51:30

标签: c gcc linker cygwin portable-executable

过去,我在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_ = .;
  }


}

0 个答案:

没有答案