2

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

2 回答 2

4

此类符号用于编译器生成的静态初始值设定项。来自GCJ 邮件列表

的符号_GLOBAL__I__XXX用于静态初始化程序 - 即在启动时执行的代码,通常在调用 main 之前。不要沉迷于实际的 XXX - 它只是一种创造独特符号的魔法。Gcj 创建静态初始化函数,调用 _Jv_RegisterClass 在全局表中注册每个类,以便将来的 Class.forName 可以找到它们。

这谈到了 GCJ,但 C++ 编译器的行为方式与此类似。指向所有此类初始化程序的指针都放入该.ctors部分,并由 CRT 启动代码在调用之前调用main()

于 2013-04-09T13:03:54.563 回答
1

请注意,这_GLOBAL__sub_I_myFile.cpp+106只是反汇编程序制作标签的方式。它指向 label 之后的 106 个字节_GLOBAL__sub_I_myFile.cpp,我希望这是一个“初始化静态对象”类型的函数。在这种情况下,要么是编译器/链接器重用了一些代码[因为你还没有发布它,我不能说],要么是一些自动生成的代码,它不存在于“函数中”(可能是例如抛出异常)。

于 2013-04-09T13:13:39.140 回答