如何在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
相关产品推荐
相关产品推荐

