You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遵循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结构,而现代链接器为了兼容新系统特性、安全规范,默认开启了更多隐含的结构要求,比如更严格的段分离、元数据完整性检查等,这些都会增加文件的“冗余”体积。

验证与解决办法

如果要回到接近当年的紧凑体积,可以手动修改链接器参数:

  1. 指定更小的对齐值:
    ld -s -z max-page-size=512 teensy.o -o teensy
    
    这样可以把段对齐降到512字节,文件体积会大幅缩小。
  2. 使用自定义链接脚本,彻底移除所有不必要的段:
    新建一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 07:31:17