2013-04-09 79 views
2

在C++程序的反彙編視圖中,引用GLOBAL? 我有一個河旁它說:反彙編程序GLOBAL關鍵字

je 0xb74d334a <_GLOBAL__sub_I_myFile.cpp+106>

我想這是MYFILE.CPP一個電話,但我想在調用之前瞭解全局字的含義......

內容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 <[email protected]> 
test %esi, %esi 
je 0xb74d33a <_GLOBAL__sub_I_myFile.cpp+106> 
mov (%esi), %eax 
[some calls] 
+0

它可能只是一個函數內的標籤。或者它可以是一個靜態函數的名稱。無法分辨更多,信息太少。 – 2013-04-09 12:25:12

+0

你需要myFile.cpp的代碼嗎? – Xaltar 2013-04-09 12:29:11

+0

如果它不大,你可以添加它。如果它很大,則將其裁減到可拆卸爲類似事物的最小可能尺寸。當然,你需要顯示C++代碼及其反彙編,而不僅僅是一條指令。 – 2013-04-09 12:31:22

回答

4

這些符號用於編譯器生成的靜態初始值設定項。從GCJ mailing list

_GLOBAL__I__XXX的符號被用於靜態初始化 - 在啓動時執行,通常前主叫即 代碼。不要 掛在實際的XXX - 這只是一個魔術mangling創建 一個獨特的象徵。 Gcj創建靜態初始化函數,這些函數調用 _Jv_RegisterClass在全局表中註冊每個類,以便將來的Class.forName可以找到它們。

這裏討論GCJ,但C++編譯器的行爲方式類似。在調用main()之前,指向所有這些初始值設定項的指針將被放入.ctors部分,並由CRT啓動代碼調用。

+0

等待!你給我提供寶貴的信息,你在調用main()之前說過,在那種情況下代碼是什麼類型?當我們執行一個程序時,我認爲主要是被稱爲真正的第一件事...... – Xaltar 2013-04-09 13:06:10

+3

'main'是你的程序啓動的地方,但全局對象在'main'開始之前被初始化。例如,如何設置「cout」和「cin」。這不像你在'main'中分配它們,對吧?是的,這是「你通常不需要關心,也不能真正改變的魔法」,但它仍然會發生。 – 2013-04-09 13:11:36

1

請注意,_GLOBAL__sub_I_myFile.cpp+106只是製作標籤的反彙編方式。它指向標籤_GLOBAL__sub_I_myFile.cpp後的106個字節,我期望它是一個「初始化靜態對象」類型函數。在這種情況下,它可能是編譯器/鏈接器重新使用某些代碼[因爲您沒有發佈它,我不能說],或者它是一些自動生成的代碼,它不會「在函數中」生存(可能是例如拋出異常)。