有没有办法在g ++ / clang ++中使用自定义修饰?

时间:2019-02-05 21:00:17

标签: c++ g++ clang++ name-mangling

在使用c ++模板,尤其是元组时,我经常会得到很长的错误名称,例如

  

_ZN11__sanitizer13InternalAllocEmPNS_28SizeClassAllocatorLocalCacheINS_20SizeClassAllocator32ILm0ELy140737488355328ELm0ENS_12SizeClassMapILm3ELm4ELm8ELm17ELm64ELm14EEELm20ENS_15TwoLevelByteMapppYpEEUnESEEbackESES5

在标称情况下,这显然很好,并且可以简化调试,但是,当我使用自定义类型的大型元组(具有大型命名空间)时,由于名称混乱,最终会导致非常庞大的二进制文件;某些工具(例如valgrind)甚至具有符号名称的最大长度,这使得分析几乎变得不可能。

我想知道是否有一种方法可以让g ++ / clang ++使用自定义的重整函数(例如md5),从而使很长的符号变成5c66b1073e1b453900bd7d32cb79fc0e,这要短得多。

2 个答案:

答案 0 :(得分:2)

在任何重要的C ++实现中都没有这种创新 原因是C ++编译器的名称处理协议是其ABI的一部分 并且不能同时成为用户的选择。

众所周知,用GCC编译的C ++代码不能与编译的代码互操作 使用Microsoft编译器,因为除其他外,它们使用不同的名称处理 协议。而且他们确实使用了不同的名称处理协议, 并且不能被指示使用相同的ABI,从而保证了ABI更加精巧 不兼容将无法幸免于尝试的连接。

在其他工具链实用程序中也假定C ++编译器的名称处理协议具有不变性,例如binutils nmobjdump

答案 1 :(得分:1)

我不知道完全替换符号的任何方法。但是您可以使用-s剥离二进制文件以从中删除所有符号。这样可以减小附带的二进制文件的大小,但是当然不能与调试一起使用。