2013-09-26 69 views
1

已经阅读过此文件但无法解决我的问题。由objcopy生成的原始二进制文件太大

huge binary files with objcopy

对于一些测试的需要。 我必须在链接时添加以下链接脚本。

.section_test 0x11323000: { *(.section_test) } 

该自定义部分必须从大地址0x11323000开始。

然后使用objcopymips生成原始的二进制文件

objcopymips -O binary vxWorks.st E0122.bin  

这一步,使最终的原始二进制文件,bin文件,太大。从27MB到超过270MB。

以这种方式,它不能加载到我们的机器中,只有大约64MB的物理内存。

我可以在不删除任何部分的情况下缩小它的大小并仍然让它可执行吗?

回答

1

objcopy -O binary根据段的加载地址生成程序的内存映像。在你的情况下,.section_test的加载地址和运行时地址是相同的,即加载地址是0x11323000,它解释了大文件的大小。

通常的解决方案是创建一个带有压缩加载映像的可执行文件,并让程序在使用之前将必要的部分从其加载地址复制到其运行时地址。

例子:

.section_test 0x11323000 : AT(some-small-address) { *(.section_test) } 

.section_test 0x11323000 : { *(.section_test) } AT> some-region-name 

查看此网页,以及: https://sourceware.org/binutils/docs/ld/Output-Section-LMA.html#Output-Section-LMA

+0

完美的答案,非常感谢!我之前检查过这个手册,但是错过了这部分...... – oyss

+0

我明白答案,但为什么bss部分不包含在大文件中? (在上面的链接示例中) - bss部分没有“AT” – ransh

相关问题