我在 2 年前用gcc
4.5 在 debian 挤压/稳定下创建了我的引导加载程序。现在在 debian wheezy/sid 中不能用 4.6 和 4.7 编译,因为从这些创建更大的部分,我希望手动生成最终的二进制文件。现在这对我来说不是问题,因为在 debian wheezy/sid 中,gcc
4.5 仍然存在,但我希望能够使用gcc
4.6 和 4.7 进行编译。
我像这样生成最终的二进制文件:
源文件编译为:
gcc-4.5 -Wall -O3 -c -m32 -I. -o assemblybin-objects/vga_pm.S.o vga_pm.S
与连接:
ld -nostdlib -T binary.ld assemblybin-objects/vga_pm.S.o ... and other objects here ... -o bootloader.bin
的内容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!");
}
最后用 . 创建最终的二进制文件dd
。
我看到当用gcc
4.6 和 4.7 编译时,链接器在bootloader.bin
.
我正在使用ld
来自binutils
2.22 的版本,并使用我自己的构建过程的食谱进行烹饪。
我的实际问题是:
这些编译器版本之间有什么区别gcc
,它们产生更大的部分或通过 elf 目标文件指示链接器在文件开头添加这些字节bootloader.bin
?
4.6 和/或 4.7是否有任何命令行参数gcc
会关闭可能产生比gcc
4.5 更大的部分的功能,或者删除那些说链接器在文件开头添加这些字节的指令bootloader.bin
?
编辑 17-08-2012:这些天我很忙,但很快我会更新我所做的测试结果。
对@strnk 和@Dan Aloni 的回答:当我看到这个问题时,我首先要做的是排除无用的部分,但结果是一样的......我认为因为这bootloader.bin
是一个简单的二进制文件,其中所需部分的链接代码位于链接器指示的正确位置,没有节名,重定位和调试信息和符号......bootloader.bin
文件不是精灵目标文件。
请考虑实际问题的变化。谢谢你所做的一切......我很快就会回来
编辑 31-08-2012:好的,谢谢你们的帮助。@Dan Aloni 给出的答案并通过ldscript
@strnk 显示完成
/DISCARD/ : {
*(.eh_frame)
*(.eh_frame_hdr)
}
在断言之后。