我一直在使用 Ghidra 反编译一些最初为 ARMv7 编译的 .o 库文件,其中我有一些函数和结构的头文件。
假设一个结构体有几个单字节“char”成员:
struct myStruct {
char memberA;
char memberB;
char memberC;
char memberD;
} structInstance;
Run Code Online (Sandbox Code Playgroud)
如果汇编代码(可能是在构建时通过编译器优化)偷工减料并一次性访问整个 32 位字的字符,那么反编译的 C 代码将表示为:
structInstance._0_4_
Run Code Online (Sandbox Code Playgroud)
第一个数字 (0) 是起始字节的偏移量,第二个数字 (4) 是正在访问的字节数。
然而,据我所知,这是非标准的并且不会重新编译 - 至少在 GCC 中不会,而且我在任何地方都找不到任何对此表示法的引用。
有什么方法可以将 Ghidra 设置为生成实际上有效的反编译代码 - 即
*(uint32_t)&structInstance.memberA
Run Code Online (Sandbox Code Playgroud)