在Linux上混淆c++名称时,什么算符号?
What counts as a symbol while mangling C++ names on Linux?
Linux下g++/clang++
void test10058l(void*(*)(void*),void*(*)(const void*),const void*(*)(void*));
被修改为_Z10test10058lPFPvS_EPFS_PKvEPFS3_S_E
- 根据g++/clang++,这个函数定义中有多少个符号?
- 有哪些替代?(
S_
,S0_
,S1_
,…) - 什么是
S3_
?
(edit -添加一些上下文)
D语言允许通过将符号声明为extern(C++)
来与c++交互。
不幸的是,当前的实现并不总是正确的-我试图通过实现Itanium c++ ABI定义的当前g++/clang++名称mangling方案来修复它。
由于这个文档不是很清楚,我很难理解什么是一个符号
经过几次实验,我终于理解了符号是如何被替换的。特别地,限定类型创建新的符号,函数自己解释符号。指向函数的指针则是另一个符号。
下面是我提供的示例的替换的细目。
void test10058l(void*(*)(void*),void*(*)(const void*),const void*(*)(void*));
_Z10test10058lPFPvS_EPFS_PKvEPFS3_S_E
S_ ^^ : Pv void*
S0_ ^^^^^^ : FPvS_E void*()(void*)
S1_ ^^^^^^^ : PFPvS_E void*(*)(void*)
S2_ ^^ : Kv const void
S3_ ^^^ : PKv const void*
S4_ ^^^^^^^ : FS_PKvE void*()(const void*)
S5_ ^^^^^^^^ : PFS_PKvE void*(*)(const void*)
S6_ ^^^^^^^ : FS3_S_E const void*()(void*)
S7_ ^^^^^^^^ : PFS3_S_E const void*(*)(void*)
我启动这个git存储库是为了报告我关于linux/osx GCC c++名称混淆的发现。
函数篡改是依赖于编译器的活动,没有标准的方向。您可以使用以下工具修改http://demangler.com/
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- C++ C4244 =':从"std::streamsize"转换为"无符号短",可能会丢失数据;有什么解决办法吗?
- 符号":" C 和 C++ 中是什么意思?
- 无符号长整型和无符号 int 之间有什么区别,这 2 种类型应该如何在 c# 中封送?
- 这种错误的原因是什么:将"功能"重新定义为不同类型的符号
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 代码输出随机符号,我不确定出了什么问题
- 什么是 16 字节有符号整数数据类型?
- 计算机使用什么方法添加无符号整数
- dynamic_cast什么时候会因为隐藏符号而失败?
- 这个星号 (*) 符号在 C++ 中是什么意思?-- 指向成员的指针
- 指针符号在参数规范中表示什么,例如:(char16 *缓冲区,int32 大小)?C++
- & 符号在这里做什么?
- 在平等符号左侧使用RVALUE参考的规则是什么?
- 根据浮点符号对浮点进行舍入的最简单方法是什么
- 在这段 python 代码中,大于符号是什么意思
- “*(无符号整数*)((无符号整数)块 + n*i)”是什么意思
- 通过无符号 char 别名进行对象访问,加载和存储时会发生什么?
- 在矢量的尖括号内使用指针符号与在外部使用指针符号有什么区别