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

如何在GNU ld链接脚本中正确获取输入段的大小

问题原因

你调用SIZEOF()报错的核心原因是:ld链接脚本的SIZEOF()函数仅支持传入输出段名称作为参数,你传入的是汇编文件中定义的输入段名称,ld无法匹配到对应输出段,因此抛出错误。

可行的实现方法

方法1:使用自定义边界符号计算大小(最通用,不打乱段布局)

这种方法不需要修改现有段结构,只需要在你的输入段前后插入两个自定义的地址符号,差值就是段大小:
修改你的链接脚本如下:

SECTIONS {
    boot : {
        *(.boot);
        . += SECTOR_SIZE - SIZEOF(.boot_header);
        *(.boot_header);
        /* 插入自定义段起始符号 */
        __custom_section_start = .;
        /* 引入你在汇编中定义的.section输入段 */
        *(.section);
        /* 插入自定义段结束符号 */
        __custom_section_end = .;
        /* 段大小可以直接在脚本里用 __custom_section_end - __custom_section_start 调用 */
    }
}

如果你需要在代码里读取这个段大小,直接声明外部变量引用__custom_section_start和__custom_section_end即可。

方法2:将输入段单独定义为输出段,直接调用SIZEOF

如果你需要频繁在链接脚本中调用该段大小,可以把它单独定义为一个输出段,之后就可以用SIZEOF()获取大小:

SECTIONS {
    /* 先把你的输入段定义为独立输出段,地址根据你的实际需求调整 */
    .custom_section 0x10000 : {
        *(.section)
    }
    
    boot : {
        *(.boot);
        . += SECTOR_SIZE - SIZEOF(.boot_header);
        *(.boot_header);
        /* 这里直接调用SIZEOF获取大小 */
        LONG(SIZEOF(.custom_section))
    }
}
注意事项
  • 建议你把汇编里定义的段名从.section改成更有辨识度的名称(比如.my_code_section),避免和ld内置的关键字、段名规则冲突,导致匹配异常。
  • 如果汇编中定义段时指定了特殊属性(比如nobits、alloc等),链接脚本中匹配输入段时要确保属性一致,否则会出现输入段未被引入、大小计算为0的问题。

内容的提问来源于stack exchange,提问作者JustFast

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:09:02