diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/elf/ElfHeader.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/elf/ElfHeader.java index e34edbdb8a..5ec0a7bcc9 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/elf/ElfHeader.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/elf/ElfHeader.java @@ -15,9 +15,10 @@ */ package ghidra.app.util.bin.format.elf; +import java.util.*; + import java.io.IOException; import java.io.RandomAccessFile; -import java.util.*; import generic.continues.GenericFactory; import ghidra.app.util.bin.*; @@ -614,7 +615,7 @@ public class ElfHeader implements StructConverter, Writeable { // The p_offset may not refer to the start of the DYNAMIC table so we must use // p_vaddr to find it relative to a PT_LOAD segment long vaddr = dynamicHeaders[0].getVirtualAddress(); - if (vaddr == 0) { + if (vaddr == 0 || dynamicHeaders[0].getFileSize() == 0) { Msg.warn(this, "ELF Dynamic table appears to have been stripped from binary"); return; } 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 1159e134ea..f331bf6991 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 @@ -15,24 +15,28 @@ */ package ghidra.app.util.opinion; -import java.io.IOException; -import java.io.InputStream; -import java.math.BigInteger; -import java.text.NumberFormat; import java.util.*; +import java.io.*; +import java.math.BigInteger; +import java.nio.file.AccessMode; +import java.text.NumberFormat; + +import org.apache.commons.compress.compressors.xz.XZCompressorInputStream; import org.apache.commons.lang3.StringUtils; +import generic.continues.GenericFactory; import ghidra.app.cmd.label.SetLabelPrimaryCmd; import ghidra.app.util.MemoryBlockUtils; import ghidra.app.util.Option; -import ghidra.app.util.bin.ByteProvider; +import ghidra.app.util.bin.*; 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.*; import ghidra.app.util.importer.MessageLog; +import ghidra.app.util.importer.MessageLogContinuesFactory; import ghidra.framework.options.Options; import ghidra.program.database.mem.FileBytes; import ghidra.program.database.register.AddressRangeObjectMap; @@ -53,6 +57,7 @@ import ghidra.util.*; import ghidra.util.datastruct.*; import ghidra.util.exception.*; import ghidra.util.task.TaskMonitor; +import utilities.util.FileUtilities; class ElfProgramBuilder extends MemorySectionResolver implements ElfLoadHelper { @@ -1319,7 +1324,10 @@ class ElfProgramBuilder extends MemorySectionResolver implements ElfLoadHelper { // Mapped data/object symbol addresses with specific sizes HashMap
dataAllocationMap = new HashMap<>(); - ElfSymbolTable[] symbolTables = elf.getSymbolTables(); + List
+ * The ".gnu_debugdata" section contains a xz compressed minimal ELF file that has symbols that
+ * have been stripped from this binary.
+ *
+ * @param monitor checked for cancelation when copying data
+ * @return list of ElfSymbolTables, empty if not present
+ */
+ private List