2011-06-20 65 views

回答

2

這可能是不可能的。編譯通常是單向過程;一旦你這樣做了,就沒有辦法重建你的初始源代碼,並且變量名稱,註釋甚至某些子例程等內容都將被內聯和解決。這同樣適用於預編譯頭文件,因此不可能有任何好的方法來重建.gch文件中的文檔和名稱。你也許可以在標題中重新構建一些版本的名字,但是這又會和你已有的名字沒有什麼不同。除非你有備份,否則你幾乎沒有運氣。

+3

我認爲這在技術上可能是可能的,因爲'gch'文件似乎是一種「二進制頭文件」,而不是真正「編譯」的東西。預編譯頭文件包含以前在頭文件中的所有信息,例如預編譯頭文件中的宏/常量'#define'-d就像包含頭文件一樣。好消息是這麼多。對於壞消息,我不相信存在一種扭轉這一過程的工具。如果有的話,由於不同的二進制表示形式,它也必須適應_exact_編譯器版本。 – Damon

1

AFAIK gch文件是處理標頭後編譯器內存的某種轉儲(至少就其涉及的IR中涉及的數據結構而言);也許原始標題中包含的很多信息仍然以某種形式出現,但我認爲沒有提取它的工具。

2

您可以嘗試運行strings實用程序。 GCH定義了很多內部的gcc宏觀的,所以我建議你做兩個垃圾場處理字符串:

首先是你的GCH:$ strings file.h.gch

和第二是預編譯空的頭文件(或者,如果你能記住,什麼納入你的頭 - 包括在該文件中太)

然後你就可以節省轉儲和做一個diff運行:

在我的例子:

#define d1234 

#undef dsgf 

int asdfgh(char a); 
int ghjkl(int g, int h); 

中有差異,在最頂端的所有名稱:

1074a1075 
> asdfgh 
1189a1191 
> d1234 
1200a1203 
> dsgf 
1287a1291 
> ghjkl 

如何獲得結構和職能時的參數,我不知道。 但我建議如果你可以使用這個pch(例如用#pragma GCC pch_preprocess "file.h.gch"代替#include "file.h") - 那麼你可以用-fdump-tree-all-all-frtl-dump-all-all做一個樹和rtl轉儲。一些轉儲將包含更多信息,來自丟失的標題。