- java.lang.Object
-
- com.ibm.j9ddr.corereaders.elf.ELFFileReader
-
- Direct Known Subclasses:
ELF32FileReader
,ELF64FileReader
public abstract class ELFFileReader extends Object
-
-
Field Summary
Fields Modifier and Type Field Description static int
ARCH_AARCH64
static int
ARCH_AMD64
static int
ARCH_ARM
static int
ARCH_IA32
static int
ARCH_IA64
static int
ARCH_PPC32
static int
ARCH_PPC64
static int
ARCH_RISCV64
static int
ARCH_S390
static int
AT_ENTRY
static int
AT_HWCAP
static int
AT_NULL
static int
AT_PLATFORM
static int
DT_DEBUG
static int
DT_NULL
static int
DT_SONAME
static int
DT_STRTAB
static int
EI_NIDENT
static int
ELF_NOTE_HEADER_SIZE
static int
ELF_PRARGSZ
static int
ELFCLASS32
static int
ELFCLASS64
static byte
ELFDATA2LSB
static byte
ELFDATA2MSB
static short
ET_CORE
static short
ET_DYN
static short
ET_EXEC
static int
ET_HIOS
static int
ET_HIPROC
static int
ET_LOOS
static int
ET_LOPROC
static short
ET_NONE
static short
ET_NUM
static short
ET_REL
protected ImageInputStream
is
static int
NT_AUXV
static int
NT_HGPRS
static int
NT_PRPSINFO
static int
NT_PRSTATUS
protected String
sourceName
-
Constructor Summary
Constructors Modifier Constructor Description protected
ELFFileReader(File file, ByteOrder byteOrder)
protected
ELFFileReader(ImageInputStream in, long offset, long size)
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected abstract int
addressSizeBits()
boolean
canResolveAddress(long address)
Search the program header table to see whether it can successfully resolve an address into a file offset.void
close()
ByteOrder
getByteOrder()
ProgramHeaderEntry
getDynamicTableEntry()
Search the program header table for the dynamic entry.static ELFFileReader
getELFFileReader(File file)
static ELFFileReader
getELFFileReader(ImageInputStream in)
static ELFFileReader
getELFFileReaderWithOffset(ImageInputStream in, long offset, long limit)
File
getFile()
Returns the file from which this reader is reading.short
getMachineType()
Collection<? extends IMemorySource>
getMemoryRanges(long baseAddress, List<com.ibm.j9ddr.corereaders.elf.SectionHeaderEntry> sectionHeaderEntries, Map<Long,String> sectionHeaderStringTable)
Iterate through the sections that were already loaded and create a list of memory source objects for them.List<? extends ProgramHeaderEntry>
getProgramHeaderEntries()
Properties
getProperties()
List<com.ibm.j9ddr.corereaders.elf.SectionHeaderEntry>
getSectionHeaderEntries()
Map<Long,String>
getSectionHeaderStringTable()
String
getSourceName()
ImageInputStream
getStream()
Gets the data stream for this readerList<? extends ISymbol>
getSymbols(long baseAddress, boolean useUnallocatedSections)
Obtain the symbols from a core reader, offset by baseAddress.boolean
is64Bit()
boolean
isCompatibleWith(ELFFileReader otherReader)
Perform a quick check on two ELF readers to see if they represent the same library.static boolean
isELF(byte[] signature)
boolean
isExecutable()
Examine the ELF header to determine if this file is an executable or not.boolean
isTruncated()
Are any parts of the core file known to be missing?protected abstract long
padToWordBoundary(long address)
byte
readByte()
byte[]
readBytes(int len)
protected abstract long
readElfWord()
protected abstract com.ibm.j9ddr.corereaders.elf.Address
readElfWordAsAddress()
void
readFully(byte[] b, int off, int len)
int
readInt()
long
readLong()
protected abstract ProgramHeaderEntry
readProgramHeaderEntry()
short
readShort()
String
readSONAME(ELFFileReader coreFileReader)
Assume the entry given refers to a loaded library or program and find and return its name or null if it couldn't be determined.String
readString()
Reads a string from the readers current position until it is terminated by a null (0) byte.protected abstract List<com.ibm.j9ddr.corereaders.elf.ELFSymbol>
readSymbolsAt(com.ibm.j9ddr.corereaders.elf.SectionHeaderEntry entry)
boolean
sectionHeaderMapsToProgramHeader(com.ibm.j9ddr.corereaders.elf.SectionHeaderEntry section)
void
seek(long pos)
-
-
-
Field Detail
-
ELF_NOTE_HEADER_SIZE
public static final int ELF_NOTE_HEADER_SIZE
- See Also:
- Constant Field Values
-
EI_NIDENT
public static final int EI_NIDENT
- See Also:
- Constant Field Values
-
ELFDATA2LSB
public static final byte ELFDATA2LSB
- See Also:
- Constant Field Values
-
ELFDATA2MSB
public static final byte ELFDATA2MSB
- See Also:
- Constant Field Values
-
ELFCLASS32
public static final int ELFCLASS32
- See Also:
- Constant Field Values
-
ELFCLASS64
public static final int ELFCLASS64
- See Also:
- Constant Field Values
-
ELF_PRARGSZ
public static final int ELF_PRARGSZ
- See Also:
- Constant Field Values
-
ARCH_IA32
public static final int ARCH_IA32
- See Also:
- Constant Field Values
-
ARCH_PPC32
public static final int ARCH_PPC32
- See Also:
- Constant Field Values
-
ARCH_PPC64
public static final int ARCH_PPC64
- See Also:
- Constant Field Values
-
ARCH_S390
public static final int ARCH_S390
- See Also:
- Constant Field Values
-
ARCH_ARM
public static final int ARCH_ARM
- See Also:
- Constant Field Values
-
ARCH_IA64
public static final int ARCH_IA64
- See Also:
- Constant Field Values
-
ARCH_AMD64
public static final int ARCH_AMD64
- See Also:
- Constant Field Values
-
ARCH_AARCH64
public static final int ARCH_AARCH64
- See Also:
- Constant Field Values
-
ARCH_RISCV64
public static final int ARCH_RISCV64
- See Also:
- Constant Field Values
-
DT_NULL
public static final int DT_NULL
- See Also:
- Constant Field Values
-
DT_DEBUG
public static final int DT_DEBUG
- See Also:
- Constant Field Values
-
DT_SONAME
public static final int DT_SONAME
- See Also:
- Constant Field Values
-
DT_STRTAB
public static final int DT_STRTAB
- See Also:
- Constant Field Values
-
ET_NONE
public static final short ET_NONE
- See Also:
- Constant Field Values
-
ET_REL
public static final short ET_REL
- See Also:
- Constant Field Values
-
ET_EXEC
public static final short ET_EXEC
- See Also:
- Constant Field Values
-
ET_DYN
public static final short ET_DYN
- See Also:
- Constant Field Values
-
ET_CORE
public static final short ET_CORE
- See Also:
- Constant Field Values
-
ET_NUM
public static final short ET_NUM
- See Also:
- Constant Field Values
-
ET_LOOS
public static final int ET_LOOS
- See Also:
- Constant Field Values
-
ET_HIOS
public static final int ET_HIOS
- See Also:
- Constant Field Values
-
ET_LOPROC
public static final int ET_LOPROC
- See Also:
- Constant Field Values
-
ET_HIPROC
public static final int ET_HIPROC
- See Also:
- Constant Field Values
-
NT_PRSTATUS
public static final int NT_PRSTATUS
- See Also:
- Constant Field Values
-
NT_PRPSINFO
public static final int NT_PRPSINFO
- See Also:
- Constant Field Values
-
NT_AUXV
public static final int NT_AUXV
- See Also:
- Constant Field Values
-
NT_HGPRS
public static final int NT_HGPRS
- See Also:
- Constant Field Values
-
AT_NULL
public static final int AT_NULL
- See Also:
- Constant Field Values
-
AT_ENTRY
public static final int AT_ENTRY
- See Also:
- Constant Field Values
-
AT_PLATFORM
public static final int AT_PLATFORM
- See Also:
- Constant Field Values
-
AT_HWCAP
public static final int AT_HWCAP
- See Also:
- Constant Field Values
-
is
protected ImageInputStream is
-
sourceName
protected String sourceName
-
-
Constructor Detail
-
ELFFileReader
protected ELFFileReader(File file, ByteOrder byteOrder) throws IOException, InvalidDumpFormatException
-
ELFFileReader
protected ELFFileReader(ImageInputStream in, long offset, long size) throws IOException, InvalidDumpFormatException
-
-
Method Detail
-
padToWordBoundary
protected abstract long padToWordBoundary(long address)
-
readProgramHeaderEntry
protected abstract ProgramHeaderEntry readProgramHeaderEntry() throws IOException
- Throws:
IOException
-
readElfWord
protected abstract long readElfWord() throws IOException
- Throws:
IOException
-
readElfWordAsAddress
protected abstract com.ibm.j9ddr.corereaders.elf.Address readElfWordAsAddress() throws IOException
- Throws:
IOException
-
readSymbolsAt
protected abstract List<com.ibm.j9ddr.corereaders.elf.ELFSymbol> readSymbolsAt(com.ibm.j9ddr.corereaders.elf.SectionHeaderEntry entry) throws IOException
- Throws:
IOException
-
addressSizeBits
protected abstract int addressSizeBits()
-
close
public void close() throws IOException
- Throws:
IOException
-
getSourceName
public String getSourceName()
-
getELFFileReader
public static ELFFileReader getELFFileReader(File file) throws IOException, InvalidDumpFormatException
-
getELFFileReader
public static ELFFileReader getELFFileReader(ImageInputStream in) throws IOException, InvalidDumpFormatException
-
getELFFileReaderWithOffset
public static ELFFileReader getELFFileReaderWithOffset(ImageInputStream in, long offset, long limit) throws IOException, InvalidDumpFormatException
-
isELF
public static boolean isELF(byte[] signature)
-
canResolveAddress
public boolean canResolveAddress(long address)
Search the program header table to see whether it can successfully resolve an address into a file offset.If it returns true then it will be safe to call seekToAddress without an IOException being thrown. If it returns false, it will not.
- Parameters:
address
- virtual address- Returns:
- true or false according to whether the address will resolve
-
getSymbols
public List<? extends ISymbol> getSymbols(long baseAddress, boolean useUnallocatedSections) throws IOException
Obtain the symbols from a core reader, offset by baseAddress.- Parameters:
baseAddress
- the base address to offset symbols from.useUnallocatedSections
- whether to include symbols from unallocated sections. (true if reading from a library on disk, false if from a loaded library in the core file.)- Returns:
- Throws:
IOException
-
getMemoryRanges
public Collection<? extends IMemorySource> getMemoryRanges(long baseAddress, List<com.ibm.j9ddr.corereaders.elf.SectionHeaderEntry> sectionHeaderEntries, Map<Long,String> sectionHeaderStringTable) throws IOException
Iterate through the sections that were already loaded and create a list of memory source objects for them. Abandon the process if it is not possible to find the section header string table. This is one of the last sections and if it cannot be found it is a good indicator that at least part of the section header table has been overwritten. Since it is usually impossible to say where the overwriting starts it is safest to abandon it all. This is only an issue when working with a dump that does not have the original library files attached to it.- Parameters:
baseAddress
-- Returns:
- List of memory sources
- Throws:
IOException
-
sectionHeaderMapsToProgramHeader
public boolean sectionHeaderMapsToProgramHeader(com.ibm.j9ddr.corereaders.elf.SectionHeaderEntry section)
-
getSectionHeaderStringTable
public Map<Long,String> getSectionHeaderStringTable() throws IOException
- Throws:
IOException
-
is64Bit
public boolean is64Bit()
-
readBytes
public byte[] readBytes(int len) throws IOException
- Throws:
IOException
-
getMachineType
public short getMachineType()
-
getProgramHeaderEntries
public List<? extends ProgramHeaderEntry> getProgramHeaderEntries()
-
getSectionHeaderEntries
public List<com.ibm.j9ddr.corereaders.elf.SectionHeaderEntry> getSectionHeaderEntries()
-
getStream
public ImageInputStream getStream() throws IOException
Gets the data stream for this reader- Returns:
- an ImageInputStream for this reader
- Throws:
IOException
-
getFile
public File getFile()
Returns the file from which this reader is reading.- Returns:
- File or null if this reader is reading from a stream
-
getProperties
public Properties getProperties()
-
readInt
public int readInt() throws IOException
- Throws:
IOException
-
readByte
public byte readByte() throws IOException
- Throws:
IOException
-
seek
public void seek(long pos) throws IOException
- Throws:
IOException
-
getByteOrder
public ByteOrder getByteOrder()
-
readShort
public short readShort() throws IOException
- Throws:
IOException
-
readLong
public long readLong() throws IOException
- Throws:
IOException
-
readFully
public void readFully(byte[] b, int off, int len) throws IOException
- Throws:
IOException
-
readString
public String readString()
Reads a string from the readers current position until it is terminated by a null (0) byte. Bytes are read and converted to an ASCII string. string. If readByte throws an exception, null will be returned.- Returns:
- the null terminated sting at the readers current position or null
- Throws:
IOException
-
getDynamicTableEntry
public ProgramHeaderEntry getDynamicTableEntry()
Search the program header table for the dynamic entry. There should be only one of these Typically it is within the first few entries, often the third, so this is not expensive- Returns:
- the program header table entry for the dynamic table
-
isExecutable
public boolean isExecutable()
Examine the ELF header to determine if this file is an executable or not. Often it will instead be a shared library.- Returns:
- true if the file is an executable
-
isTruncated
public boolean isTruncated()
Are any parts of the core file known to be missing?
-
readSONAME
public String readSONAME(ELFFileReader coreFileReader)
Assume the entry given refers to a loaded library or program and find and return its name or null if it couldn't be determined. This method does not throw exceptions as we are seeking around the core file which could be damaged or may come from a version of linux which doesn't leave this information available, just do our best.- Parameters:
ELFFileReader
- for the core file as a whole- Returns:
- the SONAME (library name) or null
-
isCompatibleWith
public boolean isCompatibleWith(ELFFileReader otherReader)
Perform a quick check on two ELF readers to see if they represent the same library. otherReader is the one we hope is better that this reader. This is not the same as checking they are equal as we hope the other reader actually has more information in.- Parameters:
otherReader
- another ELFFileReader to compare against this one.
-
-