2014-06-16 134 views
3

我想在一個大的代碼庫中確定靜態存儲持續時間的所有對象在哪裏;以便我可以查看靜態初始化順序是否存在任何潛在問題。查找所有靜態對象的快速方法

有沒有很好的方法來做到這一點?

僅僅搜索關鍵字static還不夠好,因爲它會丟失在名稱空間範圍內聲明的任何對象。

鏈接器的地圖文件確實表明bssdata區域有多大,但是它剝奪了對於不extern符號的所有名稱。

目前我正在篩選每個查找DATA和BSS的對象文件的轉儲,但這很痛苦,並且存在大量垃圾,例如vtables類和編譯器生成的靜態數據。

+2

可能會檢查['nm']的結果(http://unixhelp.ed.ac.uk/CGI/man-cgi?nm)可能有助於做到這一點。 –

+0

這確實是一個沮喪的練習。我設法取得了一些進展(我認爲),但無法恢復名稱。希望有人會有更好的解決方案。 –

+0

我正在使用一個不同的工具鏈,它具有類似的'nm'轉儲工具;問題在於那裏有太多東西需要清理哪些是靜態對象,以及相應代碼的位置 –

回答

1

聲明:這是一個相當本地化和不完整的答案。我把它留在這裏,希望有人可以從中受益(也許可以建立它)。

使用gcc工具,在啓動時__main電話__do_global_ctors這確實的__CTOR_LIST__向後遍歷。在.so庫使用nm,例如,我得到:

00000000004e2040 d __CTOR_END__ 
00000000004e2000 d __CTOR_LIST__ 
00000000004e2050 d __DTOR_END__ 
00000000004e2048 d __DTOR_LIST__ 

從那以後,我想你可以從這些地址到正在執行的有效功能得到;但是,正如您注意到的那樣,映射回源名稱可能會很尷尬(特別是在匿名名稱空間中)。儘管(源位置)可能能夠從調試信息中恢復它們,但是到目前爲止我還沒有取得進展。