遵循Teensy ELF可执行文件教程:为何20年后ld输出体积大10倍?
为何20年后编译出的精简ELF可执行文件体积大了10倍?
你遇到的体积差异主要来自现代工具链和系统对ELF格式的默认要求变化,核心原因有这几点:
段对齐规则的大幅改变
现代Linux系统和binutils链接器默认使用4096字节的页面对齐(匹配现代CPU的内存页大小),而1999年的工具链普遍使用更小的对齐值(比如512字节)。你的程序实际代码只有10字节左右,但ELF的段必须对齐到指定的边界,剩余空间会被填充为0。比如你当前的4320字节,本质是.text段占了4096字节的对齐空间,再加上其他小辅助段的对齐开销总和。默认添加的辅助ELF段
现代binutils会自动添加一些用于兼容性和安全特性的段,比如.note.gnu.property,用来标识二进制是否支持CET、MPX等现代CPU安全机制。即使你用-s参数剥离符号表,这些段也会被保留。它们本身尺寸不大,但加上对齐要求,会进一步推高文件总大小。链接器默认行为的迭代
老版本链接器默认生成最紧凑的ELF结构,而现代链接器为了兼容新系统特性、安全规范,默认开启了更多隐含的结构要求,比如更严格的段分离、元数据完整性检查等,这些都会增加文件的“冗余”体积。
验证与解决办法
如果要回到接近当年的紧凑体积,可以手动修改链接器参数:
- 指定更小的对齐值:
这样可以把段对齐降到512字节,文件体积会大幅缩小。ld -s -z max-page-size=512 teensy.o -o teensy - 使用自定义链接脚本,彻底移除所有不必要的段:
新建一个tiny.ld脚本:
然后编译链接:ENTRY(_start) SECTIONS { . = 0x400000; .text : { *(.text) } /DISCARD/ : { *(*) } }
此时生成的文件体积会接近理论最小值(几十字节级别)。nasm -f elf64 teensy.asm ld -s -T tiny.ld teensy.o -o teensy
内容的提问来源于stack exchange,提问作者Zachary Vance
相关产品推荐
相关产品推荐

