Linker Scripts(链接脚本)能否在多个段中指定*(COMMON)?
结论:该写法不可行,无法实现两个段都包含COMMON符号的预期效果
原因说明:
- 首先明确GNU链接器(ld)的核心匹配规则:所有输入符号/输入段只会被分配到第一个匹配到它的输出段中,不会重复分配到多个输出段
- COMMON符号对应的是C/C++中未初始化的全局变量,这类符号编译阶段不会直接放到
.bss段,而是暂时标记为COMMON类型,等待链接阶段分配段地址 - 你给出的链接脚本中
.bss段的定义顺序在.newsect之前,且.bss中已经写了*(COMMON)匹配所有目标文件的COMMON符号,所有COMMON符号都会被先匹配到.bss段中,后续.newsect中的*(COMMON)不会匹配到任何符号,完全不生效 - 如果你有把部分COMMON符号放到自定义段的需求,需要调整匹配逻辑:比如要将
foo.o中的COMMON符号放到.newsect,需要把.newsect的定义放到.bss前面,在.newsect中写foo.o(COMMON)精准匹配特定目标文件的COMMON符号,再在.bss中写*(COMMON)匹配剩下的所有COMMON符号,才能实现分段效果。
内容的提问来源于stack exchange,提问作者Ryan Murphy
相关产品推荐
相关产品推荐

