当使用 C++ 模板,尤其是元组时,我经常会得到很长的错位名称,例如
_ZN11__sanitizer13InternalAllocEmPNS_28SizeClassAllocatorLocalCacheINS_20SizeClassAllocator32ILm0ELy140737488355328ELm0ENS_12SizeClassMapILm3ELm4ELm8ELm17ELm64ELm14EEELm20ENS_15TwoLevelByteMapILy32768ELy4096ENS_20NoOpMapUnmapCallbackEEES5_EEEEm
这在标称情况下显然很好,并且易于调试,但是,当我使用自定义类型的大型元组(具有大型 namespace )时,这最终会因为名称困惑而导致非常大的二进制文件;一些工具(如 valgrind)甚至有符号名称的最大长度,这使得分析几乎不可能。
我想知道是否有一种方法可以让 g++/clang++ 使用自定义的修饰函数(比如 md5),这样很长的符号就变成了 5c66b1073e1b453900bd7d32cb79fc0e
,这样就更短了。
最佳答案
在任何重要的 C++ 实现中都没有这种创新 原因是 C++ 编译器的名称修改协议(protocol)是其 ABI 的一部分。 并且不能同时是用户的选择。
众所周知,用 GCC 编译的 C++ 代码不能与编译的代码互操作 使用 Microsoft 编译器是因为,除其他外,它们使用不同的名称修饰 协议(protocol)。事实上,他们确实使用不同的名称修改协议(protocol), 并且不能被指示使用同一个,保证更微妙的 ABI 不兼容性将无法在尝试连接后继续存在。
在其他工具链实用程序中也假定 C++ 编译器的名称修改协议(protocol)的稳定性,例如binutils nm
, objdump
.
关于c++ - 有没有办法在 g++/clang++ 中使用自定义修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54542962/