ARM GNU Toolchain链接报错:error adding symbols: bad value求助
问题描述
我正使用ARM GNU Toolchain(11.3版本)构建ARM应用。主程序需要链接静态库foo,而foo又间接依赖另一个静态库bar。
编译库和主程序为ELF目标文件的过程能成功完成,但尝试将程序与库组合链接时(例如执行arm-none-eabi-gcc foo.o bar.o -o foobar.o),会出现如下致命错误:
c:/arm_toolchain_11/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/bin/ld.exe: foo.o: in function `no symbol': (.text.fooSome_Function+0x0): multiple definition of `no symbol'; foo.o:(.text.fooSome_OtherFunction+0x0): first defined here ... c:/arm_toolchain_11/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/bin/ld.exe: foo.o: .symtab local symbol at index 8830 (>= sh_info of 8046) c:/arm_toolchain_11/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/bin/ld.exe: foo.o: error adding symbols: bad value collect2.exe: error: ld returned 1 exit status
对目标文件执行file命令的结果:
# file foo.o foo.o: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), not stripped # file bar.o bar.o: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), not stripped
两者格式一致。执行readelf -sW命令时,输出末尾有警告:
readelf: Warning: local symbol 8830 found at index >= .symtab's sh_info value of 8046
注:在Windows系统的MSYS2环境中构建,无法提供源代码。
可能的原因与解决方案
1. 符号表结构异常
readelf的警告提示.symtab中存在局部符号索引超出sh_info值的情况,这违反了ELF规范——ELF要求全局符号必须排在局部符号之前,sh_info表示第一个局部符号的索引。出现这个问题通常是编译过程中符号表生成异常导致的。
解决方法:
- 重新编译静态库:确保编译
foo和bar时使用正确的ARM目标参数(比如-march、-mcpu等),避免交叉编译参数不匹配。 - 清理构建缓存:删除旧的
.o文件和静态库文件,从头开始编译,避免增量编译导致的文件损坏。
2. 工具链版本或环境问题
Windows下MSYS2环境可能存在工具链路径、依赖库冲突的情况,或者ARM GNU Toolchain 11.3版本本身存在已知的符号表生成bug。
解决方法:
- 切换工具链版本:尝试升级到最新版ARM GNU Toolchain,或者降级到稳定的旧版本(比如10.x系列),验证问题是否消失。
- 检查MSYS2环境:确保环境变量中没有混入其他版本的GCC或LD工具,执行
which arm-none-eabi-gcc和which arm-none-eabi-ld确认使用的是目标工具链的程序。
3. 静态库构建方式问题
如果静态库是通过手动打包.o文件生成的,可能存在打包过程中符号表被破坏的情况。
解决方法:
- 使用正确的
ar命令构建静态库:执行arm-none-eabi-ar rcs libfoo.a foo1.o foo2.o ...重新生成静态库,确保ar工具来自目标ARM工具链,而非系统自带的版本。
4. 链接顺序问题
虽然当前错误提示不是典型的链接顺序问题,但静态库的链接顺序可能影响符号解析,尝试调整链接顺序,将依赖库放在被依赖库之后,比如:
arm-none-eabi-gcc main.o -lfoo -lbar -o app.elf
内容的提问来源于stack exchange,提问作者Joshua Schroijen
相关产品推荐
相关产品推荐

