STM32 HAL库中__weak函数被用户重定义后中断仍跳默认死循环的链接脚本排查

· 行业用户 · 6 浏览

回答(4)

用nm看符号:强定义应为T,若仍是W说明你的文件没参与链接或签名不一致,C++记得extern "C"。
码农阿杰 · 2026-11-13
检查启动文件向量表:很多工程中断入口直接写Default_Handler,HAL弱函数根本没进向量表,需改启动文件或重定向。
CortexM小白 · 2026-11-13
先看map文件,确认你的函数是否被链接进去;若被gc-sections回收,加KEEP或__attribute__((used))。
嵌入式老张 · 2026-11-13
这是典型的弱符号未生效问题,优先查链接脚本与启动文件。1) 确认重定义函数与__weak原型签名完全一致(含参数、返回类型、C++时加extern "C"),否则是不同符号。2) 检查启动文件startup_stm32xxxx.s中中断向量表是否指向Default_Handler,而HAL的__weak函数只是被向量表间接调用;若向量表项仍为默认处理,说明中断入口未重定向。3) 查看链接脚本是否把用户.o放在弱符号定义之前,或使用了--gc-sections把未引用的强符号段回收;用arm-none-eabi-nm -C查符号类型,强符号应为T而非W。4) 确认没有多个同名弱定义竞争,以及map文件里最终选用的是哪个目标文件。5) 若使用C++,检查名字修饰导致符号不匹配。建议用调试器在HardFault_Handler和Default_Handler下断点,结合反汇编确认向量表实际跳转地址。
mcuku 阿沐 · 2026-11-13

🧰 配套工具

⏱️ 定时器计算器