From 50315536955f02d01e818c94fe2a7931c4fc690d Mon Sep 17 00:00:00 2001 From: ghidra1 Date: Mon, 13 Jul 2026 11:23:48 -0400 Subject: [PATCH] GP-7061 Corrected ELF Import regression related to dynamic GNU Hashtable and symbol table processing --- .../ghidra/app/util/bin/format/elf/ElfHeader.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) 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 1d78f42dfe..8e23f00d9f 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 @@ -992,6 +992,10 @@ public class ElfHeader implements StructConverter { symCount = reader.readInt(symbolHashTableOffset + 4); // nchain from DT_HASH } + if (symCount == 0) { + return null; + } + // NOTE: When parsed from dynamic table and not found via section header parse // it is assumed that the extended symbol section table is not used. @@ -1006,7 +1010,7 @@ public class ElfHeader implements StructConverter { /** * Walk DT_GNU_HASH table to determine dynamic symbol count * @param gnuHashTableOffset DT_GNU_HASH table file offset - * @return dynamic symbol count + * @return dynamic symbol count (0 may be returned when processing error occurs) * @throws IOException file read error */ private int deriveGnuHashDynamicSymbolCount(long gnuHashTableOffset) throws IOException { @@ -1059,22 +1063,21 @@ public class ElfHeader implements StructConverter { } private long getMaxOffsetForLoadedRegionContaining(long offset, long minSize) { - long maxOffset = -1; if (e_shnum != 0) { ElfSectionHeader sectionContaining = getSectionHeaderContainingFileRange(offset, minSize); if (sectionContaining != null) { - maxOffset = sectionContaining.getOffset() + sectionContaining.getSize() - 1; + return sectionContaining.getOffset() + sectionContaining.getSize() - 1; } } - else { + if (e_phnum != 0) { ElfProgramHeader containingSegment = getProgramLoadHeaderContainingFileOffset(offset); if (containingSegment != null) { - maxOffset = containingSegment.getOffset() + containingSegment.getFileSize() - 1; + return containingSegment.getOffset() + containingSegment.getFileSize() - 1; } } - return maxOffset; + return -1; } /**