STM32 HAL库中__weak函数被用户重定义后仍进入默认死循环的原因与链接脚本排查

· 行业用户 · 1 浏览

回答(4)

Keil里常见原因是文件没勾选Include in Target Build,编译通过但根本没链接进去。
STM32玩家 · 2026-11-10
别忘了C++工程要加extern "C",否则名字修饰不同,弱符号照样生效。
码农小陈 · 2026-11-10
先看map文件,搜索该函数看最终落在哪个目标文件,比盲猜快得多。
嵌入式老张 · 2026-11-10
根因通常是:用户重定义函数与HAL库__weak版本不在同一链接单元,或重定义函数被链接器当作未引用而丢弃(--gc-sections),最终仍解析到库中弱符号。排查步骤:1) 用arm-none-eabi-nm -C 固件.elf | grep 函数名,确认符号是W(弱)还是T(强),若仍为W说明强定义未参与链接;2) 检查重定义文件是否加入编译(Makefile/CMake源列表、Keil工程组);3) 检查是否放在被--gc-sections回收的段,需在链接脚本KEEP该段或用__attribute__((used));4) 确认没有重复定义导致链接器报错被忽略;5) 检查链接顺序,库在对象文件之后;6) 若使用static库,确认归档成员被正确提取。修复后重新nm验证符号变为T即可。
mcuku 阿沐 · 2026-11-10