Package ghidra.app.util.bin.format.elf
Class ElfRelocation
- java.lang.Object
-
- ghidra.app.util.bin.format.elf.ElfRelocation
-
- All Implemented Interfaces:
ByteArrayConverter
,StructConverter
public class ElfRelocation extends java.lang.Object implements ByteArrayConverter, StructConverter
A class to represent the Elf32_Rel and Elf64_Rel data structure.
typedef uint32_t Elf32_Addr; typedef uint64_t Elf64_Addr; typedef uint32_t Elf32_Word; typedef uint64_t Elf64_Xword; REL entry: typedef struct { Elf32_Addr r_offset; Elf32_Word r_info; } Elf32_Rel; typedef struct { Elf64_Addr r_offset; Elf64_Xword r_info; } Elf64_Rel; RELA entry with addend: typedef struct { Elf32_Addr r_offset; Elf32_Word r_info; Elf32_Sword r_addend; } Elf32_Rela; typedef struct { Elf64_Addr r_offset; //Address Elf64_Xword r_info; //Relocation type and symbol index Elf64_Sxword r_addend; //Addend } Elf64_Rela; RELR entry (see SHT_RELR, DT_RELR): NOTE: Relocation type is data relative and must be specified by appropriate relocation handler (see
ElfRelocationHandler.getRelrRelocationType()
) since it is not contained within the relocation table which only specifies r_offset for each entry.
-
-
Field Summary
Fields Modifier and Type Field Description protected static java.lang.String
R_ADDEND_COMMENT
protected static java.lang.String
R_INFO_COMMENT
protected static java.lang.String
R_OFFSET_COMMENT
-
Constructor Summary
Constructors Constructor Description ElfRelocation()
DO NOT USE THIS CONSTRUCTOR, USE create*(GenericFactory ...) FACTORY METHODS INSTEAD.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description long
getAddend()
This member specifies a constant addend used to compute the value to be stored into the relocatable field.long
getOffset()
This member gives the location at which to apply the relocation action.int
getRelocationIndex()
long
getRelocationInfo()
Returns the r_info relocation entry field valuestatic int
getStandardRelocationEntrySize(boolean is64bit, boolean hasAddend)
Get the standard relocation size when one has notbeen specifiedint
getSymbolIndex()
Returns the symbol index where the relocation must be made.int
getType()
The type of relocation to apply.boolean
hasAddend()
Returns true if this is a RELA entry with addendprotected void
initElfRelocation(ElfHeader elfHeader, int relocationTableIndex, boolean withAddend, long r_offset, long r_info, long r_addend)
Initialize ELF relocation entry using data provided via the parameters.protected void
initElfRelocation(FactoryBundledWithBinaryReader reader, ElfHeader elfHeader, int relocationTableIndex, boolean withAddend)
Initialize ELF relocation entry using data from the binary reader's current position.protected boolean
is32Bit()
void
setOffset(int offset)
Sets the relocation offset to the new specified value.void
setOffset(long offset)
Sets the relocation offset to the new specified value.void
setType(long type)
Set the relocation type associated with this relocation.protected int
sizeof()
byte[]
toBytes(DataConverter dc)
Returns a byte array representing this implementor of this interface.DataType
toDataType()
Returns a structure datatype representing the contents of the implementor of this interface.java.lang.String
toString()
-
-
-
Field Detail
-
R_OFFSET_COMMENT
protected static final java.lang.String R_OFFSET_COMMENT
- See Also:
- Constant Field Values
-
R_INFO_COMMENT
protected static final java.lang.String R_INFO_COMMENT
- See Also:
- Constant Field Values
-
R_ADDEND_COMMENT
protected static final java.lang.String R_ADDEND_COMMENT
- See Also:
- Constant Field Values
-
-
Method Detail
-
initElfRelocation
protected void initElfRelocation(FactoryBundledWithBinaryReader reader, ElfHeader elfHeader, int relocationTableIndex, boolean withAddend) throws java.io.IOException
Initialize ELF relocation entry using data from the binary reader's current position.- Parameters:
reader
- binary reader positioned to the relocation entry data. If null, a representative instance will be generated with all fields set to 0.elfHeader
- ELF headerrelocationTableIndex
- index of relocation within relocation tablewithAddend
- true if if RELA entry with addend, else false- Throws:
java.io.IOException
-
initElfRelocation
protected void initElfRelocation(ElfHeader elfHeader, int relocationTableIndex, boolean withAddend, long r_offset, long r_info, long r_addend) throws java.io.IOException
Initialize ELF relocation entry using data provided via the parameters.- Parameters:
elfHeader
- ELF headerrelocationTableIndex
- index of relocation within relocation tablewithAddend
- true if if RELA entry with addend, else falser_offset
- The offset for the entryr_info
- The info value for the entryr_addend
- The addend for the entry- Throws:
java.io.IOException
-
getRelocationIndex
public int getRelocationIndex()
- Returns:
- index of relocation within its corresponding relocation table
-
is32Bit
protected boolean is32Bit()
- Returns:
- true if processing a 32-bit header, else 64-bit
-
getOffset
public long getOffset()
This member gives the location at which to apply the relocation action. For a relocatable file, the value is the byte offset from the beginning of the section to the storage unit affected by the relocation. For an executable file or a shared object, the value is the virtual address of the storage unit affected by the relocation.- Returns:
- the location at which to apply the relocation
-
setOffset
public void setOffset(int offset)
Sets the relocation offset to the new specified value.- Parameters:
offset
- the new offset value
-
setOffset
public void setOffset(long offset)
Sets the relocation offset to the new specified value.- Parameters:
offset
- the new offset value
-
getSymbolIndex
public int getSymbolIndex()
Returns the symbol index where the relocation must be made. A value of 0 is generally returned when no symbol is relavent to the relocation.- Returns:
- the symbol index
-
getType
public int getType()
The type of relocation to apply. NOTE 1: Relocation types are processor-specific (seeElfRelocationHandler
). NOTE 2: A type of 0 is returned by default for RELR relocations and must be updated during relocation processing (seesetType(long)
). The appropriate RELR relocation type can be obtained from the appropriateElfRelocationHandler.getRelrRelocationType()
orElfRelocationContext.getRelrRelocationType()
if available.- Returns:
- type of relocation to apply
-
setType
public void setType(long type)
Set the relocation type associated with this relocation. Updating the relocation type is required for RELR relocations.- Parameters:
type
- relocation type to be applied
-
getRelocationInfo
public long getRelocationInfo()
Returns the r_info relocation entry field value- Returns:
- r_info value
-
getAddend
public long getAddend()
This member specifies a constant addend used to compute the value to be stored into the relocatable field. This value will be 0 for REL entries which do not supply an addend.- Returns:
- a constant addend
-
hasAddend
public boolean hasAddend()
Returns true if this is a RELA entry with addend- Returns:
- true if this is a RELA entry with addend
-
toDataType
public DataType toDataType()
Description copied from interface:StructConverter
Returns a structure datatype representing the contents of the implementor of this interface.For example, given:
class A { int foo; double bar; }
The return value should be a structure data type with two data type components; an INT and a DOUBLE. The structure should contain field names and, if possible, field comments.
- Specified by:
toDataType
in interfaceStructConverter
- Returns:
- returns a structure datatype representing the implementor of this interface
- See Also:
StructureDataType
-
getStandardRelocationEntrySize
public static int getStandardRelocationEntrySize(boolean is64bit, boolean hasAddend)
Get the standard relocation size when one has notbeen specified- Parameters:
is64bit
- true if ELF 64-bithasAddend
- true if relocation has addend- Returns:
- size of relocation entry
-
toBytes
public byte[] toBytes(DataConverter dc)
Description copied from interface:ByteArrayConverter
Returns a byte array representing this implementor of this interface.- Specified by:
toBytes
in interfaceByteArrayConverter
- Parameters:
dc
- the data converter to use- Returns:
- a byte array representing this object
- See Also:
ByteArrayConverter.toBytes(ghidra.util.DataConverter)
-
toString
public java.lang.String toString()
- Overrides:
toString
in classjava.lang.Object
-
sizeof
protected int sizeof()
-
-