Class 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.
     
     
    • 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 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​(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()  
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
    • 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 header
        relocationTableIndex - index of relocation within relocation table
        withAddend - 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 header
        relocationTableIndex - index of relocation within relocation table
        withAddend - true if if RELA entry with addend, else false
        r_offset - The offset for the entry
        r_info - The info value for the entry
        r_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
      • 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 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 java.lang.String toString()
        Overrides:
        toString in class java.lang.Object
      • sizeof

        protected int sizeof()