Package ghidra.app.util.bin.format.elf

# Class ElfRelocation

java.lang.Object
ghidra.app.util.bin.format.elf.ElfRelocation

All Implemented Interfaces:
  `StructConverter`

public class ElfRelocation extends Object implements 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.

NOTE: instantiation relies on the use of a default constructor which must be implemented by any extension. An extension should implement the methods `initElfRelocation(BinaryReader, ElfHeader, int, boolean)` and/or `initElfRelocation(ElfHeader, int, boolean, long, long, long)`.

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `protected static final String`
  `R_ADDEND_COMMENT`
  `protected static final String`
  `R_INFO_COMMENT`
  `protected static final String`
  `R_OFFSET_COMMENT`

  ### Fields inherited from interface ghidra.app.util.bin.StructConverter

  `ASCII, BYTE, DWORD, IBO32, IBO64, POINTER, QWORD, SLEB128, STRING, ULEB128, UTF16, UTF8, VOID, WORD`

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `ElfRelocation()`
  Instantiate an uninitialized relocation object.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `long`
  `getAddend()`
  This member specifies the RELA signed-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 value
  `static int`
  `getStandardRelocationEntrySize(boolean is64bit, boolean hasAddend)`
  Get the standard relocation size when one has notbeen specified
  `int`
  `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 addend
  `protected void`
  `initElfRelocation(BinaryReader reader, ElfHeader elfHeader, int relocationTableIndex, boolean withAddend)`
  Initialize ELF relocation entry using data from the binary reader's current position.
  `protected void`
  `initElfRelocation(ElfHeader elfHeader, int relocationTableIndex, boolean withAddend, long offset, long info, long addend)`
  Initialize ELF relocation entry using data provided via the parameters.
  `protected boolean`
  `is32Bit()`
  `void`
  `setType(long type)`
  Set the relocation type associated with this relocation.
  `protected int`
  `sizeof()`
  `DataType`
  `toDataType()`
  Returns a structure datatype representing the contents of the implementor of this interface.
  `String`
  `toString()`

  ### Methods inherited from class java.lang.Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

- ## Field Details

  - ### R_OFFSET_COMMENT

    protected static final String R_OFFSET_COMMENT
    See Also:
      - Constant Field Values

  - ### R_INFO_COMMENT

    protected static final String R_INFO_COMMENT
    See Also:
      - Constant Field Values

  - ### R_ADDEND_COMMENT

    protected static final String R_ADDEND_COMMENT
    See Also:
      - Constant Field Values

- ## Constructor Details

  - ### ElfRelocation

    public ElfRelocation()
    Instantiate an uninitialized relocation object.

    NOTE: This method is intended for use by the various factory methods which should generally be used when building-up a relocation table (see `createElfRelocation(BinaryReader, ElfHeader, int, boolean)` and `createElfRelocation(ElfHeader, int, boolean, long, long, long)`).

- ## Method Details

  - ### initElfRelocation

    protected void initElfRelocation(BinaryReader reader, ElfHeader elfHeader, int relocationTableIndex, boolean withAddend) throws 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 header
      `relocationTableIndex` - index of relocation within relocation table
      `withAddend` - true if if RELA entry with addend, else false
    Throws:
      `IOException` - if an IO or parse error occurs

  - ### initElfRelocation

    protected void initElfRelocation(ElfHeader elfHeader, int relocationTableIndex, boolean withAddend, long offset, long info, long addend) throws IOException
    Initialize ELF relocation entry using data provided via the parameters.
    Parameters:
      `elfHeader` - ELF header
      `relocationTableIndex` - index of relocation within relocation table
      `withAddend` - true if if RELA entry with addend, else false
      `offset` - The offset for the entry (r_offset)
      `info` - The info value for the entry (r_info)
      `addend` - The signed-addend (r_addend) for the entry (32-bit addends should be signed-extended to 64-bits)
    Throws:
      `IOException` - if an IO or parse error occurs

  - ### 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

  - ### 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 (see `ElfRelocationHandler`). NOTE 2: A type of 0 is returned by default for RELR relocations and must be updated during relocation processing (see `setType(long)`). The appropriate RELR relocation type can be obtained from the appropriate `ElfRelocationHandler.getRelrRelocationType()` or `ElfRelocationContext.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 the RELA signed-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 and may rely on an implicit addend stored at the relocation offset. See `hasAddend()` which is true for RELA / Elf_Rela and false for REL / Elf_Rel relocations.
    Returns:
      addend as 64-bit signed constant

  - ### 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 interface `StructConverter`
    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-bit
      `hasAddend` - true if relocation has addend
    Returns:
      size of relocation entry

  - ### toString

    public String toString()
    Overrides:
      `toString` in class `Object`

  - ### sizeof

    protected int sizeof()