我使用GCC 4.8编译了一个应用程序,我试图在没有GDB 7.5+的旧系统上调试它(据说它增加了对DWARF-4的支持)。在该系统上升级GDB不是一种选择。我无法调试它,因为GDB输出以下消息:
Dwarf Error: wrong version in compilation unit header (is 4, should be 2) [in module a.out]
我尝试使用-gdwarf-2 -gstrict-dwarf进行编译,如其他问题所示,但编译器会继续插入一些版本4的编译单元头:
/tmp> readelf --debug-dump=info a.out | grep -A2 'Compilation Unit @'
readelf: Warning: CU at offset 6b contains corrupt or unsupported version number: 4.
readelf: Warning: CU at offset 1eb contains corrupt or unsupported version number: 4.
Compilation Unit @ offset 0x0:
Length: 0x67 (32-bit)
Version: 2
--
Compilation Unit @ offset 0x6b:
Length: 0x84 (32-bit)
Version: 4
--
Compilation Unit @ offset 0xf3:
Length: 0x62 (32-bit)
Version: 2
--
Compilation Unit @ offset 0x159:
Length: 0x8e (32-bit)
Version: 2
--
Compilation Unit @ offset 0x1eb:
Length: 0x136 (32-bit)
Version: 4
--
Compilation Unit @ offset 0x325:
Length: 0x62 (32-bit)
Version: 2
即使您按如下方式编译最小C程序,也会发生这种情况:
/home/MuchToLearn/src> cat main.c
int main(void)
{
return 0;
}
/home/MuchToLearn/src> gcc -gdwarf-2 -gstrict-dwarf main.c
我在这里遗漏了什么吗?如果不能生成可以由仅支持DWARF-2的旧GDB版本调试的二进制文件,那么使用-gdwarf-2选项有什么意义?
编辑:受雇俄罗斯人的回答是正确的。版本4编译单元来自/usr/lib/crt1.o
和/usr/lib/libc_nonshared.a
。要解决此问题,我将它们复制到本地目录中,并使用strip -g
删除其调试符号。然后,我将可执行文件链接如下:
ld -o main -dynamic-linker /lib/ld-linux.so.2 crt1.o /usr/lib/crti.o main.o /lib/libc.so.6 libc_nonshared.a /usr/lib/crtn.o
生成的可执行文件不包含任何版本4编译单元,GDB停止抱怨。