linux – 我的引导程序无法使用gcc 4.6和4.7 …只编译4.5

linux – 我的引导程序无法使用gcc 4.6和4.7 …只编译4.5,第1张

概述在2年之前,我使用 gcc 4.5在debian挤压/稳定下创建了我的bootloader.现在在debian wheezy / sid不能用4.6和4.7编译,因为创建了更大的部分,我希望手工制作最终的二进制文件.这对我来说现在不是问题,因为在debian wheezy / sid中,gcc 4.5还在,但我希望可以使用gcc 4.6和4.7进行编译. 我生产这样的最终二进制: 源文件编译为: 在2年之前,我使用 gcc 4.5在debian挤压/稳定下创建了我的bootloader.现在在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的开头添加一些字节(250-300).

我正在使用来自binutils 2.22的ld,并用自己的配方进行构建过程.

我的实际问题是:

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

有没有gcc 4.6和/或4.7的命令行参数,这将关闭一个功能,可能会产生比gcc 4.5更大的部分,或删除说明链接器添加这些字节的说明在bootloader.bin文件的开头?

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

对@strnk和@Dan Aloni的回答:当我看到这个问题,我做的第一个是排除无用的部分,但结果是一样的…我认为,因为bootloader.bin是一个简单的二进制文件,需要连接的代码部分在链接器指示的正确位置,没有段名称,重定位和调试信息和符号… bootloader.bin文件不是elf对象文件.

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

编辑31-08-2012:好的,谢谢你的帮助.由@Dan Aloni提供的答案,并通过ld脚本完成@strnk显示

/disCARD/ : {    *(.eh_frame)    *(.eh_frame_hdr)}

在断言之后.

解决方法 通过使用您提供的标志,gcc-4.5和gcc-4.6之间编译一个平凡的C文件,并使用objdump -h来检查输出,似乎.eh_frame部分是在gcc-4.6中引入的.

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

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

总结

以上是内存溢出为你收集整理的linux – 我的引导程序无法使用gcc 4.6和4.7 …只编译4.5全部内容,希望文章能够帮你解决linux – 我的引导程序无法使用gcc 4.6和4.7 …只编译4.5所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1048988.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存