STM32 HAL库中__weak函数被用户重写后仍进默认实现的原因与链接脚本排查

· 行业用户 · 13 浏览

回答(4)

注意--gc-sections和链接脚本KEEP:用户函数若只被弱引用,可能被回收;用nm看符号类型W/T最快定位。
STM32玩家 · 2026-11-06
C++工程最容易踩坑:HAL头文件按C编译,用户重写函数必须加extern "C",否则名字修饰不同,链接器仍选弱符号。
码农小何 · 2026-11-06
先看map文件里该符号来自哪个.o,若来自HAL库说明用户文件没参与链接,优先查工程文件包含和编译输出。
嵌入式老张 · 2026-11-06
在STM32 HAL库中,__weak函数被用户重写后仍进入默认实现,最常见原因是链接器没有把用户实现纳入最终映像,或弱符号解析顺序不符合预期。排查步骤:1)确认用户函数签名与HAL声明完全一致(含参数类型、const、返回值),C++工程需加extern "C";2)检查用户源文件是否被加入编译(Makefile/CMake/IAR工程文件),并确认目标文件确实参与链接;3)用arm-none-eabi-nm -C查看最终elf中该符号,若显示W(weak)说明用户强符号未链接进来,若显示T则已生效;4)检查链接脚本是否把用户目标文件放在被丢弃的段,或使用了--gc-sections导致未引用段被回收;5)确认没有多个弱定义或库顺序问题,必要时用--whole-archive或把用户实现放前面;6)若使用静态库,确保用户实现不在被覆盖的库成员中。最后用map文件确认符号来源。
mcuku 阿沐 · 2026-11-06