在没有c ++ filt的情况下解析名称修改

时间:2015-05-18 05:11:35

标签: c++ linker name-mangling

我需要从大型C ++项目中删除未使用的函数。阅读一段时间后,我使用了这个链接:How can I know which parts in the code are never used?

我使用makefile在RedHat上编译。我在编译器中添加了标志:
-Wall -Wconversion -ffunction-sections -fdata-sections
和链接器标志:
-Wl 下, - rpath中,的 - 还原函数, - GC-段, - 打印-GC-部分
出于某些恼人的原因,即使在使用 - demangle 选项后​​,我也会在修改后收到输出。例如:

/usr/bin/ld: Removing unused section '.text._ZN8TRACABLED0Ev' in file 'CMakeFiles/oded.dir/oded.cpp.o' /usr/bin/ld: Removing unused section '.text._ZN8TRACABLED1Ev' in file 'CMakeFiles/oded.dir/oded.cpp.o'

所以我有6000个函数名称需要解开,我不能使用extern C

我可以编写一个脚本来解析它并使用 c ++ filt ,但我正在寻找一种解决方案,让链接器自己解开函数!

任何人都知道这种解决方案是否存在?

1 个答案:

答案 0 :(得分:1)

  

出于某些恼人的原因,即使在使用--demangle选项

之后,我也会在修改后收到输出

来自man ld

--demangle[=style]
--no-demangle

These options control whether to demangle symbol names in
error messages and other output.

但是这些消息:

Removing unused section '.text._ZN8TRACABLED0Ev' in file

关于符号名称。它们是关于部分的名称,恰好有时包含符号名称。所以这是有记录的。

现在,如果你真的想对它做点什么,你可以开发一个链接补丁来解码部分名称,并将其发送给GNU binutils维护者。

但更简单的选择可能是通过c++filt简单地管理您想要解组的邮件。例如:

echo "Removing unused section '.text._ZN8TRACABLED0Ev' in file" |
  sed -e 's/_ZN/ _ZN/' | c++filt

产生

Removing unused section '.text.  TRACABLE::~TRACABLE()' in file