使用-g -O和strip进行构建与仅使用-O进行构建是否存在缺点

era*_*ran 8 c gcc

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

要发布,我可以有两个选择:

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

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

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

谢谢.

Gun*_*iez 8

使用时没有运行时性能损失-g.调试信息位于可执行文件的单独部分中,如果执行该文件,则甚至无法加载.

但是如果您愿意,可以将调试信息和可执行文件分开(这仍然不会产生任何性能差异).我的Gentoo Linux以这种方式处理它,原因是简单地减少了使用的磁盘空间,这允许我将所有二进制文件放在一个小的快速磁盘上,同时仍然在一个单独的分区中保留调试信息(这是最常见的从未使用过的).

objcopy --only-keep-debug foo foo.debug
strip -g foo
Run Code Online (Sandbox Code Playgroud)

现在你有一个foo可执行文件和一个包含调试符号的foo.debug.