先确认覆盖函数签名与__weak声明完全一致(含返回类型、参数、C++时extern "C"),再查链接脚本与段放置:__weak函数通常放在.text.*,若被覆盖函数因链接脚本被放到不同段(如.text.override)且未参与同一符号解析,链接器仍选弱符号。排查步骤:1) 用arm-none-eabi-nm -C 固件.elf | grep 函数名,看是否出现两个符号(W弱、T强),若只有W说明强符号未被编入;2) 检查覆盖函数所在源文件是否被加入编译(Makefile/CubeIDE排除列表);3) 检查是否被--gc-sections回收,强符号所在段无KEEP且无引用会被丢弃;4) 查看map文件确认强符号是否被丢弃及原因;5) 若使用静态库,确认库中目标文件未被优先链接弱实现。修复:确保强符号目标文件参与链接、在链接脚本KEEP强符号段、避免同名符号被LTO内联或优化掉。