STM32L053R8T6:libgcc函数__gnu_thumb1_case_sqi无法移至RAM的问题
问题原因与解决方案
核心问题
你的链接脚本配置未生效有两个关键原因:
- 排除对象错误:你要移动的目标函数是
__gnu_thumb1_case_sqi,它属于_thumb1_case_sqi.o文件,但你仅在链接脚本中排除了_thumb1_case_uqi.o,完全未处理_thumb1_case_sqi.o,导致该函数仍被默认放入Flash的.text段。 - 仅排除无意义,需主动指定RAM存放:即使正确排除目标文件,链接器仍会将未匹配到特定段的代码默认归入
.text段。你必须显式定义RAM中的代码段,并将目标函数的代码分配到该段。
修正后的链接脚本配置
1. 添加RAM代码段定义
在SECTIONS块中,.text段之前或之后添加一个专门用于RAM代码的段(例如.text_ram),指定其存放在RAM中:
/* 存放需要运行在RAM中的代码 */ .text_ram : { . = ALIGN(4); /* 明确指定libgcc中的目标文件 */ *libgcc.a:_thumb1_case_sqi.o(.text) *libgcc.a:_thumb1_case_uqi.o(.text) /* 如果也需要移动该函数,可保留此行 */ . = ALIGN(4); } >RAM AT>FLASH
>RAM:指定段的运行地址在RAMAT>FLASH:指定段的加载地址在Flash(启动时需通过代码将该段从Flash复制到RAM,STM32标准启动文件通常支持自定义段复制,若不需要可省略此部分)
2. 修正.text段的排除规则
在原.text段中,同时排除_thumb1_case_sqi.o和_thumb1_case_uqi.o:
.text : { . = ALIGN(4); /* 排除两个目标文件的.text和.text*段 */ *(EXCLUDE_FILE(libgcc.a:_thumb1_case_sqi.o libgcc.a:_thumb1_case_uqi.o) .text) *(EXCLUDE_FILE(libgcc.a:_thumb1_case_sqi.o libgcc.a:_thumb1_case_uqi.o) .text*) *(.glue_7) /* glue arm to thumb code */ *(.glue_7t) /* glue thumb to arm code */ *(.eh_frame) /* 其他原有内容 */ } >FLASH
额外说明
- 由于
__gnu_thumb1_case_sqi是libgcc库中的函数,无法直接修改其源码添加__attribute__((section))属性,因此只能通过链接脚本强制分配段。 - 若使用
AT>FLASH,需确保启动代码中包含将.text_ram段从Flash复制到RAM的逻辑。STM32L0的标准启动文件可通过修改__etext、__data_start__等符号扩展支持自定义段复制,或手动添加复制代码。
内容的提问来源于stack exchange,提问作者Alex C
相关产品推荐
相关产品推荐

