C 使用-g-O和strip构建与仅使用-O构建相比是否存在缺点

C 使用-g-O和strip构建与仅使用-O构建相比是否存在缺点,c,gcc,C,Gcc,我有一个Linux的C代码可执行文件 对于发布,我可以有两个选项: 一个是使用-g-O3构建,剥离调试(strip-g)并将输出作为发行版发送。 第二个是直接用-O3构建发布 如果我理解正确,第一个选项的优点是,我可以在剥离之前使用exe进行远程调试或分析内核转储 问题是这种方法是否有任何缺点,例如,使用-g构建然后剥离是否存在运行时性能开销 谢谢。使用-g不会影响运行时性能。调试信息位于可执行文件的一个单独部分,如果执行该文件,甚至不会加载该部分 但是,如果愿意,您可以将调试信息和可执行文件分

我有一个Linux的C代码可执行文件

对于发布,我可以有两个选项:

一个是使用-g-O3构建,剥离调试(strip-g)并将输出作为发行版发送。 第二个是直接用-O3构建发布

如果我理解正确,第一个选项的优点是,我可以在剥离之前使用exe进行远程调试或分析内核转储

问题是这种方法是否有任何缺点,例如,使用-g构建然后剥离是否存在运行时性能开销


谢谢。

使用
-g
不会影响运行时性能。调试信息位于可执行文件的一个单独部分,如果执行该文件,甚至不会加载该部分

但是,如果愿意,您可以将调试信息和可执行文件分开(这仍然不会造成任何性能差异)。我的GentooLinux就是这样处理的,原因很简单,就是尽量减少使用的磁盘空间,这样我就可以将所有二进制文件放在一个小的快速磁盘上,同时还可以将调试信息(通常从未使用过)保存在一个单独的分区中

objcopy --only-keep-debug foo foo.debug
strip -g foo

现在您有了一个foo可执行文件和一个foo.debug,其中包含调试符号。

请记住,只要代码在语义上相同,优化就可以大量重写代码;而且这样做非常积极。因此,即使存在调试信息,编译后的代码也可能与您的源代码不太匹配,这使得调试具有“挑战性”。查看GCC中各种单独优化开关的文档,了解代码可以更改多少。谢谢。我知道这个问题,但调试这个比调试裸优化的可执行文件要容易得多。@Haendel:在每一种更新、更快的磁盘技术的生命周期中,有一段时间,一个足够大的磁盘来容纳一个操作系统安装是痛苦的;-)此外,设备越小、越便宜,这段时间就越长,因为与总体成本相比,花式快速磁盘的成本更高。对于发行版来说,一个只包含二进制文件的包和另一个只包含调试信息的包更具吸引力。只有少数用户需要下载第二个软件包,对于那些用户来说,这比下载一个单独的、带有二进制+调试的软件包要好得多,后者必须取代前者。