gcc objcopy生成的bin文件远大于size输出text+data总和的原因问询
问题原因解答
1. objcopy导出二进制文件时复制的段规则
- 默认执行
-O binary参数时,objcopy会提取ELF文件中所有标记了ALLOC(运行时分配内存)、LOAD(需要加载到内存)属性的段,不局限于常规的代码段(.text)、初始化数据段(.data)。 - 未标记上述属性的段(比如调试信息、符号表,你添加的
-S-g参数已经完成了这类段的剥离,不会计入bin文件大小)、以及仅标记NOBITS属性的bss段(仅记录大小、运行时才由加载器分配清零,无实际存储内容)都不会被复制到bin文件中。
2. bin文件远大于text+data总和的原因
objcopy生成的是平铺内存映射格式的二进制文件,会严格按照各可加载段的**加载地址(LMA)**顺序拼接内容:
- 如果两个可加载段的加载地址不连续,中间的地址空隙会被自动填充
0x00,保证bin文件的偏移量和运行时的内存地址一一对应,这部分填充的空字节就是大小差值的核心来源。 - 你当前的test.elf中除了.text、.data段之外,大概率还有其他带
ALLOC/LOAD属性的段(比如只读数据段.rodata、异常向量表段、用户自定义的可加载段等),这些段之间的地址空隙填充后,就导致最终bin文件远大于text+data的大小总和。
可选优化方案
如果不需要地址映射对齐,只想导出指定段的内容,可以在objcopy命令中用-j参数手动指定要导出的段,示例:
objcopy -S -g -O binary -j .text -j .data test.elf test_no_gap.bin
这样生成的bin文件大小就等于text和data段的大小总和。
内容的提问来源于stack exchange,提问作者Wanghz
相关产品推荐
相关产品推荐

