在C ++程序的反汇编视图中,引用GLOBAL
的内容是什么?
我有一个lign说:
je 0xb74d334a <_GLOBAL__sub_I_myFile.cpp+106>
我想这是对myFile.cpp的调用,但我想知道在调用之前GLOBAL字的含义......
myFile.cpp的内容:
[include guards]
#include <mutex.hpp> // Functions I use to handle mutex
namespce myNameSpace {
class myClass {
public:
static void stdOutFormat(const char* format, ...);
private:
static Mutex(Synchro) // Custom functions from mutex.hpp and others ...
};
}
[end include guards]
反汇编(我尽可能简洁):
[some calls]
call 0xb74d1b80 <os_mutexInit@plt>
test %esi, %esi
je 0xb74d33a <_GLOBAL__sub_I_myFile.cpp+106>
mov (%esi), %eax
[some calls]
答案 0 :(得分:4)
此类符号用于编译器生成的静态初始化程序。来自GCJ mailing list:
_GLOBAL__I__XXX
的符号用于静态初始值设定项 - 即 通常在调用main之前在启动时执行的代码。别 挂在实际的XXX上 - 这只是一个神奇的创造 一个独特的象征。 Gcj创建调用的静态初始化函数 _Jv_RegisterClass在全局表中注册每个类,因此未来的Class.forName可以找到它们。
这谈到了GCJ,但C ++编译器的行为方式类似。所有此类初始值设定项的指针都放入.ctors
部分,并在调用main()
之前由CRT启动代码调用。
答案 1 :(得分:1)
请注意_GLOBAL__sub_I_myFile.cpp+106
只是反汇编者制作标签的方式。它指向标签_GLOBAL__sub_I_myFile.cpp
之后的106个字节,我期望它是“初始化静态对象”类型函数。在这种情况下,它是编译器/链接器重新使用一些代码[因为你没有发布它,我不能说],或者它是一些自动生成的代码,它不存在于“函数”中(可能是一个异常抛出,例如)。