From b3261c06347bba5a2b77d9ed8fa10faf9973b9dd Mon Sep 17 00:00:00 2001 From: ghidra1 Date: Fri, 2 Jul 2021 12:27:33 -0400 Subject: [PATCH 1/2] GP-1097 Corrected ELF Import relocation error reporting when missing relocation handler --- .../app/util/opinion/ElfProgramBuilder.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/ElfProgramBuilder.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/ElfProgramBuilder.java index 23d153999c..7081714925 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/ElfProgramBuilder.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/ElfProgramBuilder.java @@ -31,8 +31,7 @@ import ghidra.app.util.bin.format.MemoryLoadable; import ghidra.app.util.bin.format.elf.*; import ghidra.app.util.bin.format.elf.ElfDynamicType.ElfDynamicValueType; import ghidra.app.util.bin.format.elf.extend.ElfLoadAdapter; -import ghidra.app.util.bin.format.elf.relocation.ElfRelocationContext; -import ghidra.app.util.bin.format.elf.relocation.ElfRelocationHandler; +import ghidra.app.util.bin.format.elf.relocation.*; import ghidra.app.util.importer.MessageLog; import ghidra.framework.options.Options; import ghidra.framework.store.LockException; @@ -732,19 +731,27 @@ class ElfProgramBuilder extends MemorySectionResolver implements ElfLoadHelper { private void processRelocations(TaskMonitor monitor) throws CancelledException { monitor.setMessage("Processing relocation tables..."); + ElfRelocationTable[] relocationTables = elf.getRelocationTables(); + if (relocationTables.length == 0) { + return; + } + boolean processRelocations = ElfLoaderOptionsFactory.performRelocations(options); + if (processRelocations && ElfRelocationHandlerFactory.getHandler(elf) == null) { + log("ELF relocation handler extension not found! Unable to process relocations."); + } Address defaultBase = getDefaultAddress(elf.adjustAddressForPrelink(0)); AddressSpace defaultSpace = defaultBase.getAddressSpace(); long defaultBaseOffset = defaultBase.getAddressableWordOffset(); int totalCount = 0; - for (ElfRelocationTable relocationTable : elf.getRelocationTables()) { + for (ElfRelocationTable relocationTable : relocationTables) { totalCount += relocationTable.getRelocationCount(); } monitor.initialize(totalCount); - for (ElfRelocationTable relocationTable : elf.getRelocationTables()) { + for (ElfRelocationTable relocationTable : relocationTables) { monitor.checkCanceled(); @@ -877,7 +884,7 @@ class ElfProgramBuilder extends MemorySectionResolver implements ElfLoadHelper { memory.getBytes(relocAddr, bytes); - if (context != null && context.hasRelocationHandler()) { + if (context != null) { if (relrTypeUnknown) { ElfRelocationHandler.markAsUnsupportedRelr(program, relocAddr); } From 9a1e83d9ce99263f2c0c0495e0b18157ccf8daf2 Mon Sep 17 00:00:00 2001 From: ghidra1 Date: Tue, 6 Jul 2021 09:14:39 -0400 Subject: [PATCH 2/2] GP-1042 corrected tests --- .../listing/ExternalFunctionMergeManagerTest.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Ghidra/Features/Base/src/test.slow/java/ghidra/app/merge/listing/ExternalFunctionMergeManagerTest.java b/Ghidra/Features/Base/src/test.slow/java/ghidra/app/merge/listing/ExternalFunctionMergeManagerTest.java index 1d4363b28e..9418128702 100644 --- a/Ghidra/Features/Base/src/test.slow/java/ghidra/app/merge/listing/ExternalFunctionMergeManagerTest.java +++ b/Ghidra/Features/Base/src/test.slow/java/ghidra/app/merge/listing/ExternalFunctionMergeManagerTest.java @@ -76,7 +76,7 @@ public class ExternalFunctionMergeManagerTest extends AbstractExternalMergerTest assertEquals("apples", function.getName()); assertEquals(SourceType.USER_DEFINED, function.getSymbol().getSource()); checkDataType(DataType.DEFAULT, function.getReturnType()); - assertEquals(SourceType.USER_DEFINED, function.getReturn().getSource()); + assertEquals(SourceType.DEFAULT, function.getReturn().getSource()); assertEquals("unknown", function.getCallingConventionName()); assertEquals(new AddressSet(), function.getBody()); assertEquals(null, function.getComment()); @@ -297,7 +297,7 @@ public class ExternalFunctionMergeManagerTest extends AbstractExternalMergerTest assertEquals("apples", function.getName()); assertEquals(SourceType.USER_DEFINED, function.getSymbol().getSource()); checkDataType(DataType.DEFAULT, function.getReturnType()); - assertEquals(SourceType.USER_DEFINED, function.getReturn().getSource()); + assertEquals(SourceType.DEFAULT, function.getReturn().getSource()); assertEquals("unknown", function.getCallingConventionName()); assertEquals(new AddressSet(), function.getBody()); assertEquals(null, function.getComment()); @@ -518,7 +518,7 @@ public class ExternalFunctionMergeManagerTest extends AbstractExternalMergerTest assertEquals("apples", function.getName()); assertEquals(SourceType.USER_DEFINED, function.getSymbol().getSource()); checkDataType(DataType.DEFAULT, function.getReturnType()); - assertEquals(SourceType.USER_DEFINED, function.getReturn().getSource()); + assertEquals(SourceType.DEFAULT, function.getReturn().getSource()); assertEquals("unknown", function.getCallingConventionName()); assertEquals(new AddressSet(), function.getBody()); assertEquals(null, function.getComment()); @@ -753,7 +753,7 @@ public class ExternalFunctionMergeManagerTest extends AbstractExternalMergerTest assertEquals("apples", function.getName()); assertEquals(SourceType.USER_DEFINED, function.getSymbol().getSource()); checkDataType(DataType.DEFAULT, function.getReturnType()); - assertEquals(SourceType.USER_DEFINED, function.getReturn().getSource()); + assertEquals(SourceType.DEFAULT, function.getReturn().getSource()); assertEquals("unknown", function.getCallingConventionName()); assertEquals(new AddressSet(), function.getBody()); assertEquals(null, function.getComment()); @@ -945,7 +945,7 @@ public class ExternalFunctionMergeManagerTest extends AbstractExternalMergerTest assertEquals("apples", function.getName()); assertEquals(SourceType.USER_DEFINED, function.getSymbol().getSource()); checkDataType(DataType.DEFAULT, function.getReturnType()); - assertEquals(SourceType.USER_DEFINED, function.getReturn().getSource()); + assertEquals(SourceType.DEFAULT, function.getReturn().getSource()); assertEquals("unknown", function.getCallingConventionName()); assertEquals(new AddressSet(), function.getBody()); assertEquals(null, function.getComment()); @@ -1137,7 +1137,7 @@ public class ExternalFunctionMergeManagerTest extends AbstractExternalMergerTest assertEquals("apples", function.getName()); assertEquals(SourceType.USER_DEFINED, function.getSymbol().getSource()); checkDataType(DataType.DEFAULT, function.getReturnType()); - assertEquals(SourceType.USER_DEFINED, function.getReturn().getSource()); + assertEquals(SourceType.DEFAULT, function.getReturn().getSource()); assertEquals("unknown", function.getCallingConventionName()); assertEquals(new AddressSet(), function.getBody()); assertEquals(null, function.getComment()); @@ -1372,7 +1372,7 @@ public class ExternalFunctionMergeManagerTest extends AbstractExternalMergerTest assertEquals("apples", function.getName()); assertEquals(SourceType.USER_DEFINED, function.getSymbol().getSource()); checkDataType(DataType.DEFAULT, function.getReturnType()); - assertEquals(SourceType.USER_DEFINED, function.getReturn().getSource()); + assertEquals(SourceType.DEFAULT, function.getReturn().getSource()); assertEquals("unknown", function.getCallingConventionName()); assertEquals(new AddressSet(), function.getBody()); assertEquals(null, function.getComment());