Ghidra использует нечетные имена полей, такие как "._0_4_", для представления нестандартного размера доступа при декомпиляции C
Я использовал Ghidra для декомпиляции некоторых файлов библиотеки.o, изначально скомпилированных для ARMv7, для которых у меня есть файлы заголовков для некоторых функций и структур.
Допустим, у структуры есть несколько однобайтовых членов типа char:
struct myStruct {
char memberA;
char memberB;
char memberC;
char memberD;
} structInstance;
Если ассемблерный код, предположительно посредством оптимизации компилятора, когда он был построен, срезает угол и получает доступ к целому 32-битному слову символов за один раз, то декомпилированный код C будет представлять это как:
structInstance._0_4_
Первая цифра (0) - это смещение байта, с которого начинается, а вторая цифра (4) - количество байтов, к которым осуществляется доступ.
Однако, насколько я могу судить, это нестандартно и не будет перекомпилироваться - по крайней мере, не в GCC, и я нигде не могу найти ссылку на эту нотацию.
Есть ли способ настроить Ghidra для генерации декомпилированного кода, который на самом деле был бы действительным, т.е.
*(uint32_t)&structInstance.memberA