升级新版工具链后遇DWARF版本兼容错误,求解决方案
工具链版本对比
- 旧工具链:GCC 4.9.2;C++11;CMake 3.10.1;Binutils 2.23.52;GDB 8.0.1
- 新工具链:GCC 13.1;C++20;CMake 3.26.3;Binutils 2.41;GDB 12.1
错误现象
旧工具链编译运行无异常,切换新工具链后出现大量随机版本号的DWARF错误:
BFD: Dwarf Error: found dwarf version '54929', this reader only handles version 2, 3 and 4 information.
尝试在CMakeLists.txt中添加编译参数指定DWARF 4:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -lm -w -std=c++20 -gdwarf-4")
错误减少为单个但仍存在:
BFD: Dwarf Error: found dwarf version '5', this reader only handles version 2, 3 and 4 information.
错误触发于调用bfd_map_over_sections()(声明于bfd.h)后,且GCC版本高于10.2时均会出现此问题。
解决建议
1. 全局统一DWARF版本配置
仅修改CMAKE_CXX_FLAGS可能覆盖不全,需确保所有编译单元、链接环节都强制使用DWARF 4:
# 针对C/C++编译单元 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -gdwarf-4") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -gdwarf-4") # 针对链接环节 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gdwarf-4") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gdwarf-4")
同时检查项目中子模块、第三方依赖的CMake配置,确保它们未单独设置冲突的DWARF版本参数。
2. 确保链接新版Binutils的BFD库
报错显示BFD reader仅支持到DWARF 4,说明项目可能链接了系统自带的旧版BFD库(而非新工具链的Binutils 2.41版本)。需在CMake中明确指定新Binutils的库路径:
# 替换为你的新Binutils实际安装路径 link_directories("/path/to/new/binutils/lib") include_directories("/path/to/new/binutils/include")
编译时可通过查看链接命令,确认-lbfd指向的是新工具链版本。
3. 强制关闭GCC的DWARF 5自动启用
GCC 10+在使用C++20时会默认启用DWARF 5,即使指定-gdwarf-4也可能被覆盖,需添加参数强制关闭:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -gdwarf-4 -gno-dwarf5")
4. 清理旧编译产物
旧工具链生成的目标文件、库可能残留DWARF 5信息,导致混合编译出错:
- 删除CMake缓存目录(如
build文件夹),执行make clean后重新编译。
内容的提问来源于stack exchange,提问作者Cat Dynamics

