2011-06-20 13 views

Odpowiedz

2

Prawdopodobnie nie jest to możliwe. Kompilacja jest zwykle procesem jednokierunkowym; kiedy to zrobisz, nie ma możliwości zrekonstruowania początkowego kodu źródłowego, a rzeczy takie jak nazwy zmiennych, komentarze, a nawet niektóre podprogramy będą zaznaczone i wyprasowane. To samo dotyczy prekompilowanych nagłówków, więc nie istnieje żaden dobry sposób na zrekonstruowanie dokumentacji i nazw z pliku .gch. Być może zrekonstruowałbyś niektóre wersje nazw w nagłówku, ale potem znowu nie byłoby inaczej niż to, co już masz. Jeśli nie masz kopii zapasowej, masz dużo szczęścia.

+3

Myślę, że jest to technicznie możliwe, ponieważ plik 'gch' wydaje się być raczej" binarnym plikiem nagłówkowym ", a nie czymś, co było naprawdę" skompilowane ". Prekompilowane nagłówki zawierają wszystkie informacje, które wcześniej znajdowały się w nagłówkach, na przykład makra/stałe '# define' -d w prekompilowanym nagłówku są tam, jak gdybyś zawarł nagłówek jako prawdziwy. Tyle na dobre wieści. Teraz, ze względu na złą wiadomość, nie wierzę, że istnieje narzędzie do odwrócenia tego procesu. Gdyby taki był, musiałby być również dostosowany do wersji _exact_ kompilatora, z powodu różnych reprezentacji binarnych. – Damon

1

Pliki AFAIK z gch są pewnego rodzaju zrzutem pamięci kompilatora po przetworzeniu nagłówka (przynajmniej jeśli chodzi o struktury danych zaangażowane w jego IR); może duża część informacji zawartych w oryginalnym nagłówku nadal istnieje w jakiejś formie, ale nie sądzę, że istnieje narzędzie do jej wyodrębnienia.

2

Możesz spróbować uruchomić narzędzie strings. GCH mieć dużo wewnętrznej gcc makra zdefiniowane, więc proponuję zrobić dwa zrzuty z ciągów:

Pierwszy jest dla GCH: $ strings file.h.gch

a drugi jest skompilowany plik pusty nagłówka (lub, jeśli można zapamiętać , co zostało zawarte w nagłówku - to w tym pliku zbyt)

Następnie można zapisać zarówno wysypisk i zrobić biegać diff:

na moim przykładzie:

#define d1234 

#undef dsgf 

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

istnieją w diff wszystkie nazwy na samej górze:

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

jak dostać struktury i parametrów functions- nie wiem. Ale proponuję, jeśli możesz użyć tego pch (na przykład zastąpić #include "file.h" przez #pragma GCC pch_preprocess "file.h.gch") - wtedy możesz zrobić drzewo i zrzut rtl z -fdump-tree-all-all i -frtl-dump-all-all. Niektóre zrzuty zawierają więcej informacji, pochodzących z utraconego nagłówka.