我生产这样的最终二进制:
源文件编译为:
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) }
在断言之后.
解决方法
原文地址:https://www.jb51.cc/linux/393514.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。