反汇编器GLOBAL关键字

Disassembler GLOBAL keyword

本文关键字:关键字 GLOBAL 汇编器 反汇编      更新时间:2023-10-16

在c++程序的反汇编视图中,GLOBAL指的是什么?我有一个符号写着:

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]

这些符号用于编译器生成的静态初始化项。来自GCJ邮件列表:

_GLOBAL__I__XXX的符号用于静态初始化项,即:在启动时执行的代码,通常在调用main之前。不挂在实际的XXX -它只是一个神奇的混乱创造一个独特的符号。创建静态初始化函数来调用_Jv_RegisterClass将每个类注册到一个全局表中,所以未来的class。forName可以找到它们

这里讨论的是GCJ,但c++编译器的行为方式与GCJ相似。指向所有这些初始化器的指针被放入.ctors部分,并在调用main()之前由CRT启动代码调用。

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