当前位置: 首页 > news >正文

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/ 子目录编译过程中,那么结论会完全不同,需要根据具体日志判断。