Откомпилируйте файл gch - PullRequest
9 голосов
/ 21 июня 2011

Я случайно удалил файл .h, который не добавил в систему контроля версий, но у меня все еще есть файл .h.gch.Есть ли способ откомпилировать .gch?

Ответы [ 3 ]

2 голосов
/ 21 июня 2011

Вы можете попробовать запустить утилиту 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 (например, заменить #include "file.h" на #pragma GCC pch_preprocess "file.h.gch") - тогда вы можете сделать дамп дерева и rtl с -fdump-tree-all-all и -frtl-dump-all-all. Некоторые из дампов будут содержать больше информации, полученной из потерянного заголовка.

2 голосов
/ 21 июня 2011

Вероятно, это невозможно. Компиляция обычно является односторонним процессом; как только вы это сделаете, вы не сможете восстановить исходный код, и такие вещи, как имена переменных, комментарии и даже некоторые подпрограммы будут встроены и сглажены. То же самое относится и к предварительно скомпилированным заголовкам, поэтому вряд ли найдется хороший способ восстановить документацию и имена из вашего файла .gch. Возможно, вы могли бы восстановить какую-то версию имен в заголовке, но опять же это не отличалось бы от того, что у вас уже есть. Если у вас нет резервной копии, вам почти не повезло.

1 голос
/ 21 июня 2011

AFAIK Файлы gch представляют собой некий дамп памяти компилятора после обработки заголовка (по крайней мере, насколько задействованы структуры данных, связанные с его IR); возможно, значительная часть информации, содержащейся в исходном заголовке, все еще находится в некоторой форме, но я не думаю, что есть инструмент для ее извлечения.

...