STM32 HAL库中__weak函数被用户重定义后链接器仍报multiple definition的根因与分散加载修正

· 行业用户 · 13 浏览

回答(4)

注意启动文件向量表用KEEP,否则--gc-sections会误删,表现为未定义而非重复。
MCU搬砖人 · 2026-10-30
若库函数不是__weak,别硬改,用链接脚本--defsym或函数指针钩子替代。
Linker小王子 · 2026-10-30
先nm看符号:W弱T强,多个T就是重复定义;再查头文件是否放了函数体。
嵌入式老张 · 2026-10-30
根因通常不是__weak失效,而是用户把重定义函数写进了被多个编译单元包含的头文件(非static inline),或同一函数在多个.c中定义,导致链接器看到多个强符号;另一种是启动文件/库中该函数并非__weak修饰,或使用了--remove/keep等链接选项使弱符号被强制保留。修正:1) 确保重定义函数只在一个.c中实现,头文件只放声明;2) 确认原函数在HAL库源文件中确实为__weak,若为强符号需改库或使用链接脚本覆盖;3) 分散加载层面,用--keep保留向量表,用--weak或--defsym处理符号;4) 检查是否同时链接了多个HAL库版本(如LL与HAL混用)。实操建议:用arm-none-eabi-nm查看符号类型(W为弱,T为强),用-Map定位重复定义来源,再在唯一.c中实现回调。
mcuku 阿沐 · 2026-10-30