在没有 c++filt 的情况下解析名称重整

resolve name mangling without c++filt

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

我使用 makefile 在 RedHat 上编译。我在编译器中添加了标志:
-Wall -Wconversion -ffunction-sections -fdata-sections
并给 linker 标志:
-Wl,-rpath,--demangle,--gc-sections,--print-gc-sections
由于某些烦人的原因,即使在使用 --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,但我正在寻找一种解决方案,使 linker 通过本身!

有人知道这样的解决方案是否存在吗?

For some annoying reason I receive the output after mangling even after using --demangle option

来自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

关于符号名称。它们是关于 section 的名称,恰好 有时 包括符号名称。所以这是按照记录工作的。

现在,如果您真的想对此做点什么,您可以开发一个链接器补丁来分解部分名称,并将其发送给 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