Linux / Gcc / LD - 工具链。
我想从库和可执行文件中删除STL / Boost调试符号,原因有两个:
对于1.增量链接将是一个很大的改进,但AFAIK ld不支持增量链接。在1999 dr.dobb的期刊中有一个解决方法“伪增量链接”(不再在网络中,而是在archive.org(想法是将所有内容放在动态库中,并在一秒钟内放入所有更新的目标文件首先加载的一个)但这不是一般的解决方案。
对于2.有一个脚本here,但是a)它对我不起作用(它没有删除符号),b)它非常慢,因为它在管道末端工作,而提前删除符号会更有效。
显然,其他调试符号应保持不变。
答案 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中是一件小事。