10

我不小心删除了一个我没有添加到版本控制中的 .h 文件,但我仍然拥有 .h.gch。有没有办法反编译.gch?

4

3 回答 3

4

您可以尝试运行strings实用程序。GCH 定义了很多内部 gcc 宏,所以我建议你用字符串做两个转储:

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

第二个是预编译的空头文件(或者,如果你还记得的话,你的头文件中包含的内容 - 也包含在这个文件中)

然后您可以保存两个转储并进行差异运行:

对于我的例子:

#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"为)-然后您可以使用and#pragma GCC pch_preprocess "file.h.gch"进行树和 rtl 转储。一些转储将包含更多信息,这些信息源自丢失的标头。-fdump-tree-all-all-frtl-dump-all-all

于 2011-06-21T00:58:08.400 回答
3

这可能是不可能的。编译通常是单向过程;一旦你这样做了,就没有办法重建你的初始源代码,变量名、注释甚至某些子例程之类的东西都将被内联和消除。预编译的头文件也是如此,因此可能没有任何好的方法可以从 .gch 文件中重建文档和名称。您也许可以在标题中重建某些版本的名称,但是这与您已经拥有的名称没有什么不同。除非你有备份,否则你几乎不走运。

于 2011-06-20T21:48:22.400 回答
2

AFAIKgch文件是处理头文件后编译器内存的某种转储(至少就其IR中涉及的数据结构而言);也许原始标题中包含的大部分信息仍然以某种形式存在,但我认为没有工具可以提取它。

于 2011-06-20T23:13:45.043 回答