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.
我使用的是ld从binutils2.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)
断言之后.
通过使用您提供的标志,在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因此对象文件将暗示导致此问题的差异.
| 归档时间: |
|
| 查看次数: |
729 次 |
| 最近记录: |