如何强制所有编译单元使用相同的DWARF版本?
解决GCC指定DWARF版本仅单个编译单元生效的问题
问题原因
那些版本为DWARF 5的编译单元并非来自你的代码,而是工具链自带的系统标准库(如libc、启动文件crt系列)——这些库文件在工具链构建时就已经用DWARF 5生成了调试信息,你添加的-gdwarf-4 -gstrict-dwarf参数仅作用于自己编译的源文件,无法修改已编译完成的库文件的调试信息版本。
解决方案
1. 剥离库文件的调试信息(推荐)
编译链接时,通过链接器参数剥离所有库文件的调试信息,只保留自己代码的DWARF 4调试信息:
arm-linux-gnueabi-gcc test.c -gdwarf-4 -gstrict-dwarf -Wl,--strip-debug -o testProgram
如果需要保留部分库的调试信息,可以指定具体库:
arm-linux-gnueabi-gcc test.c -gdwarf-4 -gstrict-dwarf -Wl,--strip-debug=libc.a,libgcc.a -o testProgram
这样旧版GDB就不会读取到DWARF 5的编译单元,报错会消失。
2. 替换工具链的标准库(进阶)
如果必须保留库的调试信息,需要找到用DWARF 4编译的arm-linux-gnueabi标准库,替换当前Linaro工具链中lib目录下的对应文件。此方法操作复杂,需确保库版本与工具链兼容,一般不推荐。
3. 升级GDB(可选)
直接更换支持DWARF 5的GDB版本,比如使用Linaro 9.x及以上版本的工具链自带GDB,或单独安装新版GDB。若环境允许升级,这是最彻底的解决方式。
验证方法
执行以下命令检查编译单元版本,确认所有保留的编译单元均为指定的DWARF版本:
readelf --debug-dump=info testProgram | grep -A 2 'Compilation Unit @'
内容的提问来源于stack exchange,提问作者schande
相关产品推荐
相关产品推荐

