我的引导加载程序无法使用gcc 4.6和4.7 ...仅编译4.5

Mem*_*ron 10 linux gcc bootloader

我在debian squeeze/stable下用gcc4.5 创建了我的bootloader 2年.现在在debian wheezy/sid中无法使用4.6和4.7进行编译,因为从这些中创建更大的部分我希望手工生成最终的二进制文件.这对我来说不是问题,因为在debian wheezy/sid中gcc4.5仍然存在,但我想使用gcc4.6和4.7 编译成为可能.

我像这样生成最终的二进制文件:

源文件编译为:

gcc-4.5 -Wall -O3 -c -m32 -I. -o assemblybin-objects/vga_pm.S.o vga_pm.S
Run Code Online (Sandbox Code Playgroud)

与连接:

ld -nostdlib -T binary.ld assemblybin-objects/vga_pm.S.o ... and other objects here ... -o bootloader.bin
Run Code Online (Sandbox Code Playgroud)

的内容binary.ld是:

OUTPUT_FORMAT("binary","binary","binary")
OUTPUT_ARCH(i386)

SECTIONS
{
. = 0;
.bootloader : {
    . = 0x600;
    *(.bootstrap);
    . = 0x7fa;
    BYTE(0x11);
    BYTE(0x33);
    BYTE(0x55);
    BYTE(0x77);
    BYTE(0x55);
    BYTE(0xaa);
    _bootstrap_end = .;
    . = 0x800;
    *(.sysinit);
    _sysinit_end = .;
    . = 0x1000;
    *(.pages);
    _pages_end = .;
    . = 0x5000;
    *(.sysconf);
    *(.presystem);
    *(.system);
    *(.library);
    *(.text);
    *(.data);
    *(.bss);
    *(.rodata);
    *(.rodata.*);
    . = 0xeffc;
    BYTE(0x11);
    BYTE(0x33);
    BYTE(0x55);
    BYTE(0x77);
    _system_end = .;
}

. = ASSERT(_bootstrap_end <= 0x800,"Bootstrap section big!");
. = ASSERT(_sysinit_end <= 0x1000,"Sysinit section big!");
. = ASSERT(_pages_end <= 0x5000,"Pages section big!");
. = ASSERT(_system_end <= 0xf000,"System initialization section big!");
}
Run Code Online (Sandbox Code Playgroud)

最后用dd.创建最终的二进制文件.

我看到,当使用gcc4.6和4.7 编译时,链接器会在开头添加一些字节(250-300)bootloader.bin.

我使用的是ldbinutils2.22和我自己的食谱构建过程做饭.

我的实际问题是:

这些版本的gcc编译器之间有什么区别,它们产生更大的部分或指示链接器通过elf目标文件在bootloader.bin文件的开头添加这些字节?

是否有gcc4.6和/或4.7的命令行参数将关闭可能产生比gcc4.5 更大的部分的功能,或者删除那些说链接器在bootloader.bin文件开头添加这些字节的指令?

编辑17-08-2012:这些天我很忙,但很快我会用我做的测试结果更新.

回答@strnk和@Dan Aloni:当我看到这个问题时,我做的第一个是排除无用的部分,但结果是相同的...我认为因为这bootloader.bin是一个简单的二进制文件,其中包含所需部分的链接代码链接器指示正确的位置,没有节名,重定位和调试信息和符号... bootloader.bin文件不是精灵对象文件.

请考虑实际问题的变化.谢谢你的一切......我很快就会回来

编辑31-08-2012:好的家伙感谢您的帮助.@Dan Aloni给出的答案,并通过ld脚本完成,如@strnk所示

/DISCARD/ : {
    *(.eh_frame)
    *(.eh_frame_hdr)
}
Run Code Online (Sandbox Code Playgroud)

断言之后.

Dan*_*oni 9

通过使用您提供的标志,在gcc-4.5和之间编译一个普通的C文件gcc-4.6,并使用它objdump -h来检查输出,似乎.eh_frame引入了该部分gcc-4.6.

ld您提供的脚本不会处理该部分,它可能应该.您可以strip -R .eh_frame -R .eh_frame_hdr在链接之前使用从目标文件中删除该部分和其他部分.

无论如何,由于两个gcc版本的链接器是相同的,objdump -h因此对象文件将暗示导致此问题的差异.