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

# Class ElfRelocationContext<H extends ElfRelocationHandler>

java.lang.Object
ghidra.app.util.bin.format.elf.relocation.ElfRelocationContext<H>

Type Parameters:
  `H` - ELF relocation handler class

Direct Known Subclasses:
  `ElfGotRelocationContext`

public class ElfRelocationContext<H extends ElfRelocationHandler> extends Object
`ElfRelocationContext` provides a relocation handler context related to the processing of entries contained within a specific relocation table.

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `protected final H`
  `handler`
  `protected final ElfLoadHelper`
  `loadHelper`
  `protected final Program`
  `program`
  `protected ElfRelocationTable`
  `relocationTable`
  `protected final Map<ElfSymbol,Address>`
  `symbolMap`
  `protected ElfSymbolTable`
  `symbolTable`

- ## Constructor Summary

  Constructors
  Modifier
  Constructor
  Description
  `protected`
  `ElfRelocationContext(H handler, ElfLoadHelper loadHelper, Map<ElfSymbol,Address> symbolMap)`
  Relocation context for a specific Elf image and relocation table

- ## Method Summary

  Modifier and Type
  Method
  Description
  `void`
  `dispose()`
  Dispose relocation context when processing of corresponding relocation table is complete.
  `void`
  `endRelocationTableProcessing()`
  Invoked at end of relocation processing for current relocation table.
  `boolean`
  `extractAddend()`
  Determine if addend data must be extracted
  `final ElfHeader`
  `getElfHeader()`
  `long`
  `getGOTValue()`
  Returns the appropriate .got section using the DT_PLTGOT value defined in the .dynamic section.
  `long`
  `getImageBaseWordAdjustmentOffset()`
  Get image base addressable word adjustment value to be applied to any pre-linked address values such as those contained with the dynamic table.
  `final ElfLoadAdapter`
  `getLoadAdapter()`
  `final ElfLoadHelper`
  `getLoadHelper()`
  `final MessageLog`
  `getLog()`
  `final Program`
  `getProgram()`
  `Address`
  `getRelocationAddress(Address baseAddress, long relocOffset)`
  Get relocation address
  `static ElfRelocationContext<?>`
  `getRelocationContext(ElfLoadHelper loadHelper, Map<ElfSymbol,Address> symbolMap)`
  Get a relocation context for a specfic Elf image and relocation table
  `int`
  `getRelrRelocationType()`
  Get the RELR relocation type associated with the underlying relocation handler.
  `final ElfSymbol`
  `getSymbol(int symbolIndex)`
  Get the Elf symbol which corresponds to the specified index.
  `Address`
  `getSymbolAddress(ElfSymbol symbol)`
  Get the program address at which the specified Elf symbol was placed.
  `final String`
  `getSymbolName(int symbolIndex)`
  Get the ELF symbol name which corresponds to the specified index.
  `long`
  `getSymbolValue(ElfSymbol symbol)`
  Get the adjusted symbol value based upon its placement within the program.
  `final boolean`
  `hasRelocationHandler()`
  `final boolean`
  `isBigEndian()`
  `final void`
  `markRelocationError(Address relocationAddress, int typeId, int symbolIndex, String symbolName, String msg)`
  Generate relocation error log entry and bookmark.
  `protected RelocationResult`
  `processRelocation(ElfRelocation relocation, ElfSymbol elfSymbol, Address relocationAddress)`
  Process a relocation from the relocation table which corresponds to this context after preliminary checks have been performed and ELF symbol resolved.
  `final RelocationResult`
  `processRelocation(ElfRelocation relocation, Address relocationAddress)`
  Process a relocation from the relocation table which corresponds to this context.
  `void`
  `startRelocationTableProcessing(ElfRelocationTable relocTable)`
  Invoked at start of relocation processing for specified table.

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

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

- ## Field Details

  - ### handler

    protected final H extends ElfRelocationHandler handler

  - ### loadHelper

    protected final ElfLoadHelper loadHelper

  - ### symbolMap

    protected final Map<ElfSymbol,Address> symbolMap

  - ### program

    protected final Program program

  - ### relocationTable

    protected ElfRelocationTable relocationTable

  - ### symbolTable

    protected ElfSymbolTable symbolTable

- ## Constructor Details

  - ### ElfRelocationContext

    protected ElfRelocationContext(H handler, ElfLoadHelper loadHelper, Map<ElfSymbol,Address> symbolMap)
    Relocation context for a specific Elf image and relocation table
    Parameters:
      `handler` - relocation handler or null if not available
      `loadHelper` - the elf load helper
      `symbolMap` - Elf symbol placement map

- ## Method Details

  - ### startRelocationTableProcessing

    public void startRelocationTableProcessing(ElfRelocationTable relocTable)
    Invoked at start of relocation processing for specified table. The method `endRelocationTableProcessing()` will be invoked after last relocation is processed.
    Parameters:
      `relocTable` - relocation table

  - ### endRelocationTableProcessing

    public void endRelocationTableProcessing()
    Invoked at end of relocation processing for current relocation table. See `startRelocationTableProcessing(ElfRelocationTable)`.

  - ### processRelocation

    public final RelocationResult processRelocation(ElfRelocation relocation, Address relocationAddress)
    Process a relocation from the relocation table which corresponds to this context. All relocation entries will be processed in the order they appear within the table.
    Parameters:
      `relocation` - relocation to be processed
      `relocationAddress` - relocation address where it should be applied
    Returns:
      applied relocation result

  - ### processRelocation

    protected RelocationResult processRelocation(ElfRelocation relocation, ElfSymbol elfSymbol, Address relocationAddress) throws MemoryAccessException, NotFoundException
    Process a relocation from the relocation table which corresponds to this context after preliminary checks have been performed and ELF symbol resolved. All relocation entries will be processed in the order they appear within the table.
    Parameters:
      `relocation` - relocation to be processed
      `elfSymbol` - resolved ELF symbol (not null)
      `relocationAddress` - relocation address where it should be applied
    Returns:
      applied relocation result
    Throws:
      `MemoryAccessException` - if a memory access error occurs
      `NotFoundException` - NOTE: use of this exception is deprecated and should not be thrown

  - ### markRelocationError

    public final void markRelocationError(Address relocationAddress, int typeId, int symbolIndex, String symbolName, String msg)
    Generate relocation error log entry and bookmark.
    Parameters:
      `relocationAddress` - relocation address
      `typeId` - relocation type ID value (will get mapped to `ElfRelocationType.name()` if possible).
      `symbolIndex` - associated symbol index within symbol table (-1 to ignore)
      `symbolName` - relocation symbol name or null if unknown
      `msg` - error message

  - ### getRelrRelocationType

    public int getRelrRelocationType()
    Get the RELR relocation type associated with the underlying relocation handler.
    Returns:
      RELR relocation type or 0 if not supported

  - ### getRelocationContext

    public static ElfRelocationContext<?> getRelocationContext(ElfLoadHelper loadHelper, Map<ElfSymbol,Address> symbolMap)
    Get a relocation context for a specfic Elf image and relocation table
    Parameters:
      `loadHelper` - Elf load helper
      `symbolMap` - Elf symbol placement map
    Returns:
      relocation context object. A generic context will be returned if a custom one is not defined.

  - ### hasRelocationHandler

    public final boolean hasRelocationHandler()
    Returns:
      true if a relocation handler was found

  - ### getImageBaseWordAdjustmentOffset

    public long getImageBaseWordAdjustmentOffset()
    Get image base addressable word adjustment value to be applied to any pre-linked address values such as those contained with the dynamic table. (Applies to default address space only)
    Returns:
      image base adjustment value

  - ### extractAddend

    public boolean extractAddend()
    Determine if addend data must be extracted
    Returns:
      true if relocation does not provide addend data and it must be extracted from relocation target if appropriate

  - ### getProgram

    public final Program getProgram()

  - ### isBigEndian

    public final boolean isBigEndian()

  - ### getElfHeader

    public final ElfHeader getElfHeader()

  - ### getLoadHelper

    public final ElfLoadHelper getLoadHelper()

  - ### getLoadAdapter

    public final ElfLoadAdapter getLoadAdapter()

  - ### getLog

    public final MessageLog getLog()

  - ### getSymbol

    public final ElfSymbol getSymbol(int symbolIndex)
    Get the Elf symbol which corresponds to the specified index. Each relocation table may correspond to a specific symbol table to which the specified symbolIndex will be applied. In the absense of a corresponding symbol table index 0 will return a special null symbol.
    Parameters:
      `symbolIndex` - symbol index
    Returns:
      Elf symbol which corresponds to symbol index or null if out of range

  - ### getSymbolName

    public final String getSymbolName(int symbolIndex)
    Get the ELF symbol name which corresponds to the specified index.
    Parameters:
      `symbolIndex` - symbol index
    Returns:
      symbol name which corresponds to symbol index or null if out of range

  - ### getSymbolAddress

    public Address getSymbolAddress(ElfSymbol symbol)
    Get the program address at which the specified Elf symbol was placed.
    Parameters:
      `symbol` - Elf symbol
    Returns:
      program address

  - ### getSymbolValue

    public long getSymbolValue(ElfSymbol symbol)
    Get the adjusted symbol value based upon its placement within the program. This value may differ from symbol.getValue() and will reflect the addressable unit/word offset of it program address.
    Parameters:
      `symbol` - Elf symbol
    Returns:
      adjusted Elf symbol value or 0 if symbol mapping not found

  - ### getGOTValue

    public long getGOTValue() throws NotFoundException
    Returns the appropriate .got section using the DT_PLTGOT value defined in the .dynamic section. If no such dynamic value defined, the symbol offset for _GLOBAL_OFFSET_TABLE_ will be used, otherwise a NotFoundException will be thrown.
    Returns:
      the .got section address offset
    Throws:
      `NotFoundException` - if the dynamic DT_PLTGOT not defined and _GLOBAL_OFFSET_TABLE_ symbol not defined

  - ### dispose

    public void dispose()
    Dispose relocation context when processing of corresponding relocation table is complete. Instance should be disposed to allow all program changes to be flushed prior to processing a subsequent relocation table.

  - ### getRelocationAddress

    public Address getRelocationAddress(Address baseAddress, long relocOffset)
    Get relocation address
    Parameters:
      `baseAddress` - base address
      `relocOffset` - relocation offset relative to baseAddress
    Returns:
      relocation address