【发布时间】:2015-11-02 12:48:05
【问题描述】:
从 C 中我们知道什么是合法的变量名。合法名称的通用正则表达式类似于[\w_](\w\d_)*。
使用dlsym,我们可以加载任意字符串,而C++ mangles names that include @ in the ABI.。
我的问题是:可以使用任意字符串吗? dlsym 上的文档似乎没有提及任何内容。
Another question 出现似乎暗示完全有可能具有任意以空值结尾的符号。这要求我提出以下问题:
为什么 g++ 不发出带有名称和参数列表的原始函数签名,包括命名空间和类成员资格?
这就是我的意思:
namespace test {
class A
{
int myFunction(const int a);
};
}
namespace test {
int A::myFunction(const int a){return a * 2;}
}
不会被编译成
int ::test::A::myFunction(const int a)\0
相反,它被编译到 - 在我的 64 位机器上,使用 g++ 4.9.2 -
0000000000000000 T _ZN4test1A10myFunctionEi
此输出由nm 读取。代码使用g++ -c test.cpp -o out编译
【问题讨论】:
-
“原始函数签名”到底是什么意思?您是否希望这些符号具有类似
my_ns::my_class::create(int const *, bool)的名称? -
@lisyarus 这就是我的理解。这个例子很清楚。
-
@Quentin 是的,我明白了。谢谢。
-
@lisyarus:是的,甚至可能包含参数的名称,尽管这些并不重要。
-
你见过重载函数时符号的样子吗?
标签: c++ name-mangling