反汇编GLOBAL关键字

时间:2013-04-09 12:20:05

标签: c++ assembly x86 disassembly

在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]

2 个答案:

答案 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个字节,我期望它是“初始化静态对象”类型函数。在这种情况下,它是编译器/链接器重新使用一些代码[因为你没有发布它,我不能说],或者它是一些自动生成的代码,它不存在于“函数”中(可能是一个异常抛出,例如)。