2009-01-12 40 views
3

我有一個C代碼庫,需要以編程方式標識所有使用的全局變量。我認爲gcc可以生成一個內存映射文件,但不知道如何,這可能讓我看到哪些變量是全局的?任何幫助,將不勝感激。C代碼庫中的全局變量標識

乾杯

回答

6

您可以使用nm從您的目標文件中提取此類信息。

nm *.o | grep OBJT | grep GLOB 

EDIT 上述命令是Solaris的納米(SUNWbtool封裝)。對於便攜性,nm有一個參數來選擇輸出格式:

nm -f [posix|bsd|sysv] *.o 
+0

值OBJT和GLOB當我跑它,但各個按字母順序的標識符被用於替代對在與「納米」輸出生成。 'nm'是一個GNU開發工具,如果你想知道。在你的linux開發盒上試試man nm。 – 2009-01-12 11:34:54

0

爲什麼你需要知道這個?出於很多目的,靜態數據(無論是在文件還是函數範圍)都應該與全局數據分組。

通常,全局變量顯示爲數據,而不是鏈接器映射中的代碼。堆棧變量和堆分配變量不。 (當然,指向堆分配的數據可以是全局的;這只是指針與其指向的C之間的常規區別。)

1

用於輸出存儲器映射的選項是-M和鏈接器,所以要從海灣合作委員會得到它,你必須使用gcc .... -Xlinker -M

獲得這些的另一種方法是使用ctags程序。它不僅可以標記可用的函數,還可以標記可用的全局變量(並且不收集靜態信息,這與存儲器映射不同)。因爲它不編譯所有東西,所以這應該比gcc方法更快(如果你必須編譯,你當然可以免費獲得)。

0

如果你有dwarfdump和二進制文件包含DWARF調試信息(未剝離),您可以通過運行

退房 .debug_pubnames矮一節的內容

dwarfdump -p mybinary | awk '{print $2}'

它將生成一組帶有全局符號名稱的行,每行一個。