From d3a380992541537b16cf5cf1d117ddf3427bbfbc Mon Sep 17 00:00:00 2001 From: emteere <47253321+emteere@users.noreply.github.com> Date: Fri, 3 Dec 2021 23:06:45 +0000 Subject: [PATCH] GP-1575_emteere code review --- .../gcc/AbstractDwarfEHDecoder.java | 12 +++++++----- .../exceptionhandlers/gcc/DwarfDecodeContext.java | 12 ++++++++++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/exceptionhandlers/gcc/AbstractDwarfEHDecoder.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/exceptionhandlers/gcc/AbstractDwarfEHDecoder.java index 30e0cdb0a1..1d0298a2e5 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/exceptionhandlers/gcc/AbstractDwarfEHDecoder.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/exceptionhandlers/gcc/AbstractDwarfEHDecoder.java @@ -17,7 +17,6 @@ package ghidra.app.plugin.exceptionhandlers.gcc; import ghidra.app.plugin.exceptionhandlers.gcc.datatype.SignedLeb128DataType; import ghidra.app.plugin.exceptionhandlers.gcc.datatype.UnsignedLeb128DataType; -import ghidra.app.util.opinion.ElfLoader; import ghidra.program.model.address.*; import ghidra.program.model.data.*; import ghidra.program.model.listing.Program; @@ -334,10 +333,13 @@ abstract class AbstractDwarfEHDecoder implements DwarfEHDecoder { switch (appMode) { case DW_EH_PE_absptr: - // if the program has been rebased, need to add in the image base difference. - Long oib = ElfLoader.getElfOriginalImageBase(prog); - long programBaseAddressFixup = prog.getImageBase().getOffset() - oib.longValue(); - val = val + programBaseAddressFixup; + // if the program has been re-based, need to add in the image base difference. + // but only if there are no relocations at this location + if (prog.getRelocationTable().getRelocation(addr) == null) { + long programBaseAddressFixup = context.getOriginalImageBaseOffset(); + + val = val + programBaseAddressFixup; + } break; case DW_EH_PE_aligned: diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/exceptionhandlers/gcc/DwarfDecodeContext.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/exceptionhandlers/gcc/DwarfDecodeContext.java index e4177210af..6357323392 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/exceptionhandlers/gcc/DwarfDecodeContext.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/exceptionhandlers/gcc/DwarfDecodeContext.java @@ -15,6 +15,7 @@ */ package ghidra.app.plugin.exceptionhandlers.gcc; +import ghidra.app.util.opinion.ElfLoader; import ghidra.program.model.address.Address; import ghidra.program.model.listing.Function; import ghidra.program.model.listing.Program; @@ -34,6 +35,7 @@ public class DwarfDecodeContext { private Object decodedValue; private int encodedLength; private MemBuffer buffer; + private long originalImageBaseOffset; // offset from image base used in original dwarf, and the actual load image base /** * Constructs a Dwarf decode context. @@ -96,6 +98,8 @@ public class DwarfDecodeContext { this.ehBlock = ehBlock; this.functionEntryPoint = entryPoint; + Long oib = ElfLoader.getElfOriginalImageBase(program); + this.originalImageBaseOffset = program.getImageBase().getOffset() - oib.longValue(); } /** @@ -180,4 +184,12 @@ public class DwarfDecodeContext { public Address getFunctionEntryPoint() { return functionEntryPoint; } + + /** + * Gets the offset from the programs image base and the dwarf original image base + * @return offset that if added to the current image base would be the original dwarf image base + */ + public long getOriginalImageBaseOffset() { + return originalImageBaseOffset; + } }