ignore signature when parsing Rust binary dwarf

This commit is contained in:
Anciety 2021-05-21 18:46:36 +08:00 committed by dev747368
parent 9e3052ac3a
commit f1a95c84b8
2 changed files with 38 additions and 1 deletions

View file

@ -42,7 +42,30 @@ public final class DWARFSourceLanguage {
public static final int DW_LANG_UPC = 0x12;
public static final int DW_LANG_D = 0x13;
public static final int DW_LANG_Python = 0x14;
public static final int DW_LANG_OpenCL = 0x15;
public static final int DW_LANG_Go = 0x16;
public static final int DW_LANG_Modula3 = 0x17;
public static final int DW_LANG_Haskell = 0x18;
public static final int DW_LANG_C_plus_plus_03 = 0x19;
public static final int DW_LANG_C_plus_plus_11 = 0x1a;
public static final int DW_LANG_OCaml = 0x1b;
public static final int DW_LANG_Rust = 0x1c;
public static final int DW_LANG_C11 = 0x1d;
public static final int DW_LANG_Swift = 0x1e;
public static final int DW_LANG_Julia = 0x1f;
public static final int DW_LANG_Dylan = 0x20;
public static final int DW_LANG_C_plus_plus_14 = 0x21;
public static final int DW_LANG_Fortran03 = 0x22;
public static final int DW_LANG_Fortran08 = 0x23;
public static final int DW_LANG_RenderScript = 0x24;
public static final int DW_LANG_BLISS = 0x25;
public static final int DW_LANG_lo_user = 0x8000;
public static final int DW_LANG_hi_user = 0xffff;
public static final int DW_LANG_Mips_Assembler = 0x8001;
public static final int DW_LANG_GOOGLE_RenderScript = 0x8e57;
public static final int DW_LANG_SUN_Assembler = 0x9001;
public static final int DW_LANG_ALTIUM_Assembler = 0x9101;
public static final int DW_LANG_BORLAND_Delphi = 0xb000;
}

View file

@ -24,6 +24,7 @@ import ghidra.app.cmd.comments.AppendCommentCmd;
import ghidra.app.cmd.label.SetLabelPrimaryCmd;
import ghidra.app.util.bin.format.dwarf4.*;
import ghidra.app.util.bin.format.dwarf4.encoding.DWARFAttribute;
import ghidra.app.util.bin.format.dwarf4.encoding.DWARFSourceLanguage;
import ghidra.app.util.bin.format.dwarf4.encoding.DWARFTag;
import ghidra.app.util.bin.format.dwarf4.expression.*;
import ghidra.program.database.function.OverlappingFunctionException;
@ -286,7 +287,20 @@ public class DWARFFunctionImporter {
processFuncChildren(diea, dfunc);
Function gfunc = createFunction(dfunc, diea);
if (gfunc != null) {
boolean updateSignature = true;
DWARFCompilationUnit firstCompilationUnit = prog.getCompilationUnits().get(0);
if (firstCompilationUnit != null) {
Number dwarfLanguage = firstCompilationUnit.getCompileUnit().getLanguage();
// Rust does not have associated function signature
if (dwarfLanguage == (Number) DWARFSourceLanguage.DW_LANG_Rust) {
updateSignature = false;
}
}
if (gfunc != null && updateSignature) {
if (formalParams.isEmpty() && dfunc.localVarErrors) {
// if there were no defined parameters and we had problems decoding local variables,