2012-12-03 51 views
1

美好的一天!我正在努力尋找很長一段時間的決定。嘗試從編譯的文件中查找全局變量。程序無法區分常量和全局變量。

我的問題是:

例如,我有2個cpp文件,其中的一個含有

const std::string DICTIONARY_DEFAULT = "blah"; 
const std::string ADDTODICTIONARY_DEFAULT = "blah"; 
const std::string BUTTONS = "blah"; 

,第二個與

static int x1; 
static int NewY1, NewY2, NewX1, NewX2; 

兩個片段是在全球變量部分。我需要打印全局靜態變量(例如),但忽略常量。在nm輸出中,它們看起來完全相同(每種情況都是b型,這意味着未初始化的本地示波器符號)。有沒有什麼辦法可以自動使用linux公用程序(grep,regexps等等)自動分開這些情況?

MY爲了更好地理解任務:

有一個在C++程序,主要任務是找到並收回全局變量列表。 輸入數據看起來像帶有大量.cpp文件的檔案。每個.cpp文件在C++中都是語法正確的程序(它必須使用編譯器GNU C++和Microsoft Visual C++成功編譯)。 對於從存檔每個文件我都必須在獨立的字符串輸出文件的名稱和全局變量的例子中的列表,如:

輸出數據:

000000.cpp ancestor ansv cost graph M N p qr query u 
000001.cpp 
000002.cpp 
000003.cpp 
000004.cpp 
000005.cpp 
000006.cpp 
000007.cpp edge tree 
+0

你想解析一個CPP文件或編譯的庫嗎?在第一種情況下,您需要一個簡單的C++解析器(許多IDE已經有一個可以查看開源IDE的源代碼,如Code :: blocks)。無論如何,如果你只需要這樣做,不應該很難讓自己的解析器。 – GameDeveloper

回答

1

發現全局變量是一個'主題'this clang tutorial - 在本教程中,作者是爲了好玩而做的,但是你可以添加一些代碼來完成你需要的東西......(順便說一句,它不像人們猜測的那麼難):)

0

簡短回答:實際上在任何情況下都沒有辦法做到這一點

長答案:使用'objdump -x file.o'查看SYMBOL TABLE。您可以看到所有全局變量(static和const)都被分配到一個名爲.bss的節中。一個名爲.rodata的部分也存在,它通常用於存儲常量數據。不幸的是,在你的情況下,你聲明瞭兩個const std :: string對象。這些對象通過在'main'函數運行之前調用它們的構造函數來初始化。儘管如此,它們的字段初始化在運行時發生,所以它們只是'邏輯上'常量,而不是真正的常量。

編譯器別無選擇,只能將它們與所有其他全局變量一起分配到.bss節中。 如果添加以下行

const int willBeInRoData = 42; 

你會發現,它的符號將在.RODATA部分,所以這將是與其他全球整數區分。