NASM编译ELF文件时段名大小写为何导致二进制大小差异
ELF可执行文件体积差异的原因
核心原因总结
问题本质是GNU链接器(ld)对ELF节名称大小写敏感,且仅对标准小写节名应用默认内存布局规则,具体细节如下:
NASM的处理逻辑
NASM对汇编伪指令(如.text、.data)确实大小写不敏感,但会原样保留你输入的节名称大小写到目标文件(hello.o)的节表中。ld的链接规则差异
Debian默认使用的GNU ld对ELF节名称大小写敏感:
- 当目标文件存在标准小写节名(
.text、.data)时,ld会将它们归类到系统默认的代码段、数据段,严格遵循ELF可执行文件的内存页对齐要求(通常为4KB)。为满足对齐规则,ld会在节内容后添加大量填充字节,同时生成完整的标准段头信息,直接导致最终二进制文件体积较大(9048字节)。 - 当节名是大写或混合大小写(
.TEXT、.dAtA等)时,ld会将这些视为自定义节,不应用标准段的对齐规则,仅按照节的实际数据大小分配空间,也不会生成冗余的段头填充,因此最终二进制文件体积大幅缩小(4856字节)。
验证方法
可以通过readelf -S hello命令分别查看两种生成的可执行文件的节表信息,对比标准节与自定义节的Align(对齐值)和Size(占用空间)字段,就能直观看到对齐填充带来的体积差异。
内容的提问来源于stack exchange,提问作者Egor Belkov
相关产品推荐
相关产品推荐

