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

时间:2008-09-16 15:23:46

标签: c++ debugging stl

Linux / Gcc / LD - 工具链。

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

  1. 大型节目的链接速度非常慢
  2. 调试跳转到stl / boost代码,这很烦人
  3. 对于1.增量链接将是一个很大的改进,但AFAIK ld不支持增量链接。在1999 dr.dobb的期刊中有一个解决方法“伪增量链接”(不再在网络中,而是在archive.org(想法是将所有内容放在动态库中,并在一秒钟内放入所有更新的目标文件首先加载的一个)但这不是一般的解决方案。

    对于2.有一个脚本here,但是a)它对我不起作用(它没有删除符号),b)它非常慢,因为它在管道末端工作,而提前删除符号会更有效。

    显然,其他调试符号应保持不变。

6 个答案:

答案 0 :(得分:3)

GNU strip接受--strip-symbols =的正则表达式参数 STL和boost符号由于它们所在的命名空间而受到名称限制。我现在没有GCC binutils,但只是查看用于命名空间的名称修改并构造来自命名空间X的符号的正则表达式'并将其传递给--strip-symbols =

答案 1 :(得分:2)

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

另外,可以分开构建一个库,剥离它,并与剥离版本链接。

但据我所知,只有在编译单元的某些部分获取调试符号时,才能在gcc中建立和链接(对于你想要的链接时间加速)。

答案 2 :(得分:1)

您可能不希望从共享库中删除调试符号,因为在某些时候您可能需要这样做。

如果您正在使用GDB或DDD进行调试,您可以从源路径中删除Boost源文件,以便它无法跟踪到函数。 (或者只是不要追踪它们,追踪它们!)

您可以删除使用调试符号编译程序的选项,这将加快链接时间。

与您链接的脚本一样,您可以查看条带程序(“man strip”)以删除所有或某些符号。

答案 3 :(得分:1)

您可能想要使用条带。 strip --strip-unneeded --strip-debug libfoo.so

为什么不首先在没有调试的情况下构建?

答案 4 :(得分:1)

这个答案提供了我需要制作MSalters'回答删除STL符号的工作。

STL符号名称被破坏。诀窍是找到一个涵盖这些名称的正则表达式。我用GNU的Binutils看了这些符号:

> nm --debug-syms <objectfile>

我基本上搜索了STL函数,比如resize。如果这很困难,使用以下命令时输出将变为可读:

> nm --debug-syms --demangle <objectfile>

查找包含STL函数调用的行号,然后使用第一个提供的命令在同一行号上查找它的错位名称。这让我看到所有STL符号名称都以 _ZNSt [0-9] + _ZSt [0-9] + 等开头。

要允许GNU Strip删除我使用的这些符号:

> strip --wildcard              \
    --strip-symbol='_ZNKSt*'    \
    --strip-symbol='_ZNSt*'     \
    --strip-symbol='_ZSt*'      \
    --strip-symbol='_ZNSa*'     \
    <objectfile>

我直接在编译/链接二进制文件上使用这些命令。我通过比较删除之前和之后nm的输出(我将输出写入文件并使用vimdiff)来验证删除这些符号。 --wildcard选项允许使用正则表达式。虽然我希望 [0-9] * 表示0到无限数量的数字,但实际上它意味着1个数字后跟无限量的任何数字(直到行尾)。 / p>

如果您希望不进入STL代码,可以通过gdb&#39; skip file命令实现,这与here完成。

希望有所帮助

答案 5 :(得分:-1)

您使用的是哪种编译器?例如,如果我正确理解您的问题,这在MS Visual Studio中是一件小事。