在使用c ++模板,尤其是元组时,我经常会得到很长的错误名称,例如
_ZN11__sanitizer13InternalAllocEmPNS_28SizeClassAllocatorLocalCacheINS_20SizeClassAllocator32ILm0ELy140737488355328ELm0ENS_12SizeClassMapILm3ELm4ELm8ELm17ELm64ELm14EEELm20ENS_15TwoLevelByteMapppYpEEUnESEEbackESES5
在标称情况下,这显然很好,并且可以简化调试,但是,当我使用自定义类型的大型元组(具有大型命名空间)时,由于名称混乱,最终会导致非常庞大的二进制文件;某些工具(例如valgrind)甚至具有符号名称的最大长度,这使得分析几乎变得不可能。
我想知道是否有一种方法可以让g ++ / clang ++使用自定义的重整函数(例如md5),从而使很长的符号变成5c66b1073e1b453900bd7d32cb79fc0e
,这要短得多。
答案 0 :(得分:2)
在任何重要的C ++实现中都没有这种创新 原因是C ++编译器的名称处理协议是其ABI的一部分 并且不能同时成为用户的选择。
众所周知,用GCC编译的C ++代码不能与编译的代码互操作 使用Microsoft编译器,因为除其他外,它们使用不同的名称处理 协议。而且他们确实使用了不同的名称处理协议, 并且不能被指示使用相同的ABI,从而保证了ABI更加精巧 不兼容将无法幸免于尝试的连接。
在其他工具链实用程序中也假定C ++编译器的名称处理协议具有不变性,例如binutils nm
,objdump
。
答案 1 :(得分:1)
我不知道完全替换符号的任何方法。但是您可以使用-s
剥离二进制文件以从中删除所有符号。这样可以减小附带的二进制文件的大小,但是当然不能与调试一起使用。