【问题标题】:Is there a way to use custom mangling in g++/clang++?有没有办法在 g++/clang++ 中使用自定义修饰?
【发布时间】:2019-06-29 18:38:34
【问题描述】:

当使用 c++ 模板,尤其是元组时,我经常得到很长的乱码,比如

_ZN11__sanitizer13InternalAllocEmPNS_28SizeClassAllocatorLocalCacheINS_20SizeClassAllocator32ILm0ELy140737488355328ELm0ENS_12SizeClassMapILm3ELm4ELm8ELm17ELm64ELm14EEELm20ENS_15TwoLevelByteMapILy32768ELy4096ENS_2

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

我想知道是否有办法让 g++/clang++ 使用自定义修饰函数(比如 md5),这样很长的符号就变成了 5c66b1073e1b453900bd7d32cb79fc0e,它更短了。

【问题讨论】:

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


    【解决方案1】:

    我不知道有什么方法可以完全替换符号。但是您可以使用-s 剥离二进制文件以从中删除所有符号。这可以减少您交付的二进制文件的大小,但当然不能用于调试。

    【讨论】:

    • 实际上我希望编译器不要生成这么大的符号,因为在文件系统上写东西可能需要很长时间,我稍后会放弃。顺便说一句,选择修饰并不是真正的条纹,恕我直言
    【解决方案2】:

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

    众所周知,用 GCC 编译的 C++ 代码不能与编译的代码互操作 使用 Microsoft 编译器,因为,尤其是,它们使用不同的名称修饰 协议。而且他们确实使用不同的名称修饰协议, 并且不能被指示使用相同的,保证更微妙的 ABI 不兼容性将无法在尝试的链接中继续存在。

    其他工具链实用程序也假定 C++ 编译器的名称修饰协议的恒定性,例如binutils nm, objdump.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-01
      • 2023-01-26
      • 1970-01-01
      • 2020-01-18
      • 2019-11-28
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      相关资源
      最近更新 更多