【问题标题】:Disassembler GLOBAL keyword反汇编程序 GLOBAL 关键字
【发布时间】:2013-03-31 20:52:45
【问题描述】:

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

【问题讨论】:

  • 它可能只是函数内部的一个标签。或者它可以是静态函数的名称。不能说更多,信息太少。
  • 你需要myFile.cpp的代码吗?
  • 你可以添加它,如果它不是很大。如果它很大,请将其切成尽可能小的尺寸,以便拆卸成类似的东西。当然,您需要同时显示 C++ 代码及其反汇编代码,而不仅仅是一条指令。
  • 你用的是什么编译器?
  • GNU GCC 4.7.2 和基于 Qt 4.8.3 的 QtCreator 2.5.2

标签: c++ assembly x86 disassembly


【解决方案1】:

此类符号用于编译器生成的静态初始化器。来自GCJ mailing list

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

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

【讨论】:

  • 等等!你给了我宝贵的信息,你说“在调用 main() 之前”,在那种情况下是什么类型的代码?我认为 main 是我们执行程序时真正调用的第一件事......
  • main 是您的程序开始的地方,但全局对象在main 开始之前被初始化。例如,coutcin 将如何设置。这不像是您在main 中分配它们,对吧?是的,这是“你通常不需要关心,也无法真正改变的魔法”,但它仍然会发生。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2010-10-29
    • 2010-11-09
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 2013-08-04
    • 2011-09-08
    • 2010-10-08
    相关资源
    最近更新 更多