gcc as: unrecognized option --gdwarf-5 - 小镇
gcc as: unrecognized option '--gdwarf-5'
./configure --prefix=/usr --disable-doc --disable-werror
这段建议的核心结论是正确的,但有一个前提需要确认。
如果你的报错确实类似:
as: unrecognized option '--gdwarf-5'
或者:
gcc: error: dwarf version 5 is not supported by assembler
那么:
gcc -g -gdwarf-4 -o tcp_monitor tcp_monitor.c
确实是最直接的解决方案。
为什么能解决
编译流程:
tcp_monitor.c↓
gcc(cc1)↓ 生成汇编
as(assembler)↓
ld(linker)↓
tcp_monitor
你的问题实际上发生在:
gcc → as
GCC 默认生成 DWARF5 调试信息:
-g
等价于:
-gdwarf-5
而老版本 GNU as 不认识:
--gdwarf-5
所以失败。
指定:
-gdwarf-4
后 GCC 会传:
--gdwarf-4
老版本 binutils 通常支持,因此编译成功。
先确认当前版本
执行:
gcc --version
as --version
ld --version
如果看到类似:
GNU assembler 2.27
GNU assembler 2.30
GNU assembler 2.32
那基本就是 DWARF5 支持不足的问题。
更简单的办法
甚至可以试:
gcc -g0 -o tcp_monitor tcp_monitor.c
如果这样能成功,而:
gcc -g -o tcp_monitor tcp_monitor.c
失败,
那么 100% 可以确定问题在调试信息格式,而不是代码本身。
什么时候才需要升级 binutils
只有在以下情况才值得折腾:
-
需要 DWARF5
-
需要 BTF
-
需要最新 linker 特性
-
需要新版 objdump/readelf
-
需要 eBPF/内核开发工具链
如果只是:
编译 tcp_monitor.c
使用 gdb 调试
查看符号
打断点
DWARF4 完全够用。
不过我建议不要直接假设问题已经定位成功。先执行:
gcc --version
as --version
以及把原始报错完整贴出来。
如果报错不是 --gdwarf-5 相关,而是发生在 binutils 的 ld/ 子目录编译过程中,那么结论会完全不同,需要根据具体日志判断。