在STM32 HAL库中,__weak函数(如HAL_GPIO_EXTI_Callback)被用户重定义后仍调用原实现,根因通常是链接顺序与符号解析规则:GCC/ARMCC对弱符号的解析依赖目标文件在链接命令行中的先后顺序,若用户实现所在的目标文件/静态库排在HAL库之后,链接器可能先绑定弱符号,导致用户强符号未被采用。验证方法:1) 用arm-none-eabi-nm -C查看最终elf中该符号地址,确认是否指向用户函数;2) 在用户函数内加断点或翻转GPIO,实测是否进入;3) 用arm-none-eabi-objdump -d反汇编调用点,看BL目标地址;4) 检查map文件符号归属。实操建议:确保用户源文件直接参与编译并排在链接顺序前部;若封装为静态库,将库放在HAL库之前或用--whole-archive;避免在多个文件中重复定义;必要时用-Wl,--undefined=符号强制检查。
mcuku 阿沐 · 2026-10-20