如何将静态链接库中的符号放入链接脚本指定的特定段?
问题描述
我在链接脚本中定义了如下高速RAM段:
.fastram __fastram_start : AT (__fastram_lma) { __fastram_start__ = ABSOLUTE(.) ; *(.fastram.fastram*) *fastram.*(.text* .data*) . = ALIGN(4); __fastram_end__ = ABSOLUTE(.) ; } >fastram = 0x00
通常可以通过__attribute__((section(".my_awesome_section"))) void do_something()的方式将自定义函数放入指定段,但如果要静态链接第三方库且不修改原库,如何将该库的部分符号放入上述.fastram段?是否可行?
我曾尝试以相同签名重声明目标函数并添加该段属性,但通过objdump查看时,符号并未出现在预期位置。
解决方案
可行,以下是几种无需修改第三方库的实现方法:
1. 修改链接脚本,定向匹配目标符号
直接在你的.fastram段定义中,添加针对目标符号的匹配规则,让链接器将该符号从原段移到.fastram段。
比如要将第三方库中的do_something函数(位于.text段)放入.fastram,修改链接脚本如下:
.fastram __fastram_start : AT (__fastram_lma) { __fastram_start__ = ABSOLUTE(.) ; *(.text.do_something) # 新增:匹配目标函数的.text节 *(.fastram.fastram*) *fastram.*(.text* .data*) . = ALIGN(4); __fastram_end__ = ABSOLUTE(.) ; } >fastram = 0x00
注意:要确保.fastram段的定义在默认的.text/.data段之前,否则链接器会先将符号放入默认段,不会再执行移动逻辑。
如果目标符号是数据(位于.data段),则对应添加*(.data.your_target_data)。
2. 使用objcopy修改库中符号的段归属
通过objcopy工具,将第三方库中目标符号所在的节重命名为链接脚本中.fastram段匹配的节名,再参与链接。
比如将libthirdparty.a中的do_something函数所在的.text节重命名为.fastram.fastram:
# 先从库中提取目标符号对应的.o文件 ar x libthirdparty.a do_something.o # 重命名节 objcopy --rename-section .text=.fastram.fastram,contents,alloc,load,readonly,code do_something.o # 将修改后的.o文件重新打包回库 ar r libthirdparty.a do_something.o
之后正常链接即可,链接器会根据.fastram段的匹配规则,将该符号放入高速RAM段。
3. 关于重声明方法失效的原因
你尝试的重声明加属性的方法无效,是因为:
- 第三方库中的符号是强定义,链接器会优先选择库中的实现;
- 你的重声明只是符号声明,并非定义,
__attribute__((section))属性仅对符号定义生效,无法改变已有定义的段归属。
内容的提问来源于stack exchange,提问作者user678253
相关产品推荐
相关产品推荐

