这个答案提供了一些细节,我需要让 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 个数字后跟无限数量的任何东西(直到行尾)。
如果您不想进入 STL 代码,这可以通过 gdb 的skip file
命令来实现,就像在此处完成的那样。
希望能帮助到你