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

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

当使用 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/

相关文章:

c++ - int main = 0,已编译但崩溃

c++ - C++ 模板可以检查给定类型的函数是否已重载吗?

c++ - 将 QUrl 传递给 QNetworkRequest 构造函数会导致 "non-class type"编译器错误

用于旧 gcc 的 C++ 模板在 clang++ 中导致 'shadows template parameter' 错误

c++ - 无法在 Solaris 10 上使用 GCC 5.5 包含 cmath

c++ - 我应该如何分析 visual c++ express?

cmake - Clang++ 和 `-fuse-ld=gold` 导致许多未使用的选项警告

c++ - osx - 构建 POCO 库时出现链接错误

c++ - 如何同时在 CPU 和 GPU 设备上运行任务?

c++ - 绑定(bind)对象未在 VS2015 上编译