删除C ++-STL / Boost调试符号(...或者不创建它们)

时间:2020-03-05 18:56:17  来源:igfitidea点击:

Linux / Gcc / LD工具链。

我想从库和可执行文件中删除STL / Boost调试符号,有两个原因:

  • 大型程序的链接变得很慢
  • 调试跳转到stl / boost代码中,这很烦人

对于1.增量链接将是一个很大的改进,但是AFAIK ld不支持增量链接。在1999年dr.dobb的日记中有一种变通方法"伪增量链接"(不再在网络上,而是在archive.org中(想法是将所有内容都放在动态库中,而所有更新的目标文件放在第二处,首先加载),但这并不是真正的通用解决方案。

对于2.,这里有一个脚本,但是a)对我不起作用(它没有删除符号),b)它很慢,因为它在管道的末端起作用,而删除起来会更有效前面的符号。

显然,其他调试符号应保留在原位。

解决方案

回答

我们正在使用哪个编译器?例如,如果我正确理解了问题,那么在MS Visual Studio中这是一件小事。

回答

我们可能不想从共享库中剥离调试符号,因为有时可能需要这样做。

如果要使用GDB或者DDD进行调试,则可以从源路径中删除Boost源文件,从而使其无法跟踪功能。 (或者只是不追踪它们,追踪!)

我们可以删除使用调试符号编译程序的选项,这将缩短链接时间。

就像我们链接到的脚本一样,我们可以查询剥离程序(" man strip")以删除所有或者某些符号。

回答

我们可能要使用地带。
删除--strip不需要的--strip调试libfoo.so

我们为什么不先构建而不调试呢?

回答

据我所知,在gcc中没有真正的选择可以做我们想做的事情。主要问题是要剥离调试符号的所有代码都在标头中定义。

否则,将有可能分别构建一个库,剥离该库,并与剥离的版本链接。

但是据我所知,在gcc中,只能从编译单元的某些部分获取调试符号,而无法进行编译和链接(以实现所需的链接时间加速)。

回答

GNU strip接受--strip-symbols =的正则表达式参数
由于STL和boost符号所处的名称空间,它们被名称混为一谈。目前我没有GCC binutils方便的地方,而只是窥视用于名称空间的名称改写并为"来自名称空间X的符号构造正则表达式"并将其传递给--strip-symbols =