gdb:使用-g编译的二进制文件与使用-g编译的二进制编译的代码

gdb:使用-g编译的二进制文件与使用-g编译的二进制编译的代码

问题描述:

我尝试使用gdb在目标上调试嵌入式应用程序。因此,在主机上运行的gdb需要带有调试符号的二进制文件,即用-g编译的二进制文件。在目标上,一个二进制文件的剥离副本就足够了。在目标上,我尝试使用不带-g代替剥离副本编译的二进制文件,但它不起作用。gdb:使用-g编译的二进制文件与使用-g编译的二进制编译的代码

GNU strip丢弃了目标文件中的所有符号(用-g编译)。那么,这不等于一个没有-g编译的二进制文件吗?为什么它不起作用?

+0

-g还关闭默认情况下启用的优化,因此它不等同于剥离可执行文件。 –

+0

@ n.m。你错了:对于GCC,'-g'标志根本*不影响优化*。 –

+0

@EmployedRussian你是对的,必须是另一个神话,从旧的坏的许多私有unixes日子继承。 –

在主机上,我尝试使用不带-g代替剥离副本的二进制编译,但它没有工作。

你得到了相反的结论:你需要在目标上剥离二进制文件,并在主机上完全调试二进制文件。

gdbserver确实通过-g生产需要(或使用)调试信息,gdb一样。

最好是不编译两次,而是与-g一次编译,然后:

cp a.out a.out.stripped 
strip -g a.out.stripped 

,并保持两者完全调试和剥离二进制在一起。

+0

对不起,你是对的,目标和描述中的主机已被交换。我纠正了我的问题。谢谢! – xaverius

+0

回到我的问题:是否可以使用不带-g的strip来删除所有符号?如果是这样,我认为不建议编译两次,因为我们并不真正了解编译器的功能。 – xaverius

+0

@xaverius完全剥离所有符号也应该有效,但'strip'中有一些错误,比如https://sourceware.org/bugzilla/show_bug.cgi?id=11786 –