c - objcopy 生成的原始二进制文件太大

标签 c gcc linker binary mips

已阅读此内容,但无法解决我的问题。

huge binary files with objcopy

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

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

这个自定义的段必须从大地址0x11323000开始。

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

objcopymips -O binary vxWorks.st E0122.bin    

此步骤使最终的原始二进制文件(bin 文件)太大。从 27MB 到超过 270MB。

这样它就无法加载到我们只有大约 64MB 物理内存的机器中。

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

最佳答案

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

关于c - objcopy 生成的原始二进制文件太大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19019199/

相关文章:

c - C栈数组实现

gcc - 如何正确避免有关 ".ARM.exidx"部分未设置 sh_link 的警告?

gcc - 保护功能时哪个选项更强?

macos - 防止函数插入链接到执行插入的库的库中

c - 从二进制文件中获取 C 变量中的十六进制值

按关键字关闭窗口

c++ - C++ 编译器会优化掉未使用的返回值吗?

c++ - 为什么同时链接libpng和opencv没有冲突?

c++ - 链接器找不到命名空间的函数

c - 在另一个函数内声明的相互调用的函数