Class ElfSymbol

  • All Implemented Interfaces:
    ByteArrayConverter

    public class ElfSymbol
    extends java.lang.Object
    implements ByteArrayConverter
    A class to represent the ELF 32bit and 64bit Symbol data structures.
     typedef struct {
         Elf32_Word      st_name;     //Symbol name (string tbl index)
         Elf32_Addr      st_value;    //Symbol value
         Elf32_Word      st_size;     //Symbol size
         unsigned char   st_info;     //Symbol type and binding
         unsigned char   st_other;    //Symbol visibility
         Elf32_Section   st_shndx;    //Section index
     } Elf32_Sym;
     
     typedef struct {
         Elf64_Word       st_name;    //Symbol name (string tbl index)
         unsigned char    st_info;    //Symbol type and binding
         unsigned char    st_other;   //Symbol visibility
         Elf64_Section    st_shndx;   //Section index
         Elf64_Addr       st_value;   //Symbol value
         Elf64_Xword      st_size;    //Symbol size
     } Elf64_Sym;
     
     
    • Field Summary

      Fields 
      Modifier and Type Field Description
      static byte STB_GLOBAL
      Global symbols are visible to all object files being combined.
      static byte STB_GNU_UNIQUE
      Symbol is unique in namespace.
      static byte STB_LOCAL
      Local symbols are not visible outside the object file containing their definition.
      static byte STB_WEAK
      Weak symbols resemble global symbols, but their definitions have lower precedence.
      static byte STT_COMMON
      An uninitialized common block
      static byte STT_FILE
      The symbol's name gives the name of the source file associated with the object file.
      static byte STT_FUNC
      The symbol is associated with a function or other executable code.
      static byte STT_NOTYPE
      The symbol's type is not specified.
      static byte STT_OBJECT
      The symbol is associated with a data object, such as a variable, an array, etc.
      static byte STT_RELC
      Symbol is in support of complex relocation.
      static byte STT_SECTION
      The symbol is associated with a section.
      static byte STT_SRELC
      Symbol is in support of complex relocation (signed value).
      static byte STT_TLS
      In object files: st_value contains offset from the beginning of the section In DSOs: st_value contains offset in the TLS initialization image (inside of .tdata)
      static byte STV_DEFAULT
      Default symbol visibility rules
      static byte STV_HIDDEN
      Sym unavailable in other modules
      static byte STV_INTERNAL
      Processor specific hidden class
      static byte STV_PROTECTED
      Not preemptible, not exported
    • Constructor Summary

      Constructors 
      Constructor Description
      ElfSymbol()
      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
      static ElfSymbol createElfSymbol​(FactoryBundledWithBinaryReader reader, int symbolIndex, ElfSymbolTable symbolTable, ElfHeader header)
      create an ElfSymbol() Warning! the routine initSymbolName() must be called on the symbol later to initialize the string name.
      static ElfSymbol createGlobalFunctionSymbol​(ElfHeader header, int name, java.lang.String nameAsString, long addr, int symbolIndex, ElfSymbolTable symbolTable)
      Creates a new global function symbol.
      static ElfSymbol createSectionSymbol32​(ElfHeader header, long sectionAddress, short sectionHeaderIndex, java.lang.String name, int symbolIndex, ElfSymbolTable symbolTable)
      Creates a new section symbol.
      boolean equals​(java.lang.Object obj)  
      byte getBind()
      Returns the symbol's binding.
      byte getInfo()
      This member specifies the symbol's type and binding attributes.
      int getName()
      This member holds an index into the object file's symbol string table, which holds the character representations of the symbol names.
      java.lang.String getNameAsString()
      Returns the actual string name for this symbol.
      byte getOther()
      This member currently holds 0 and has no defined meaning.
      short getSectionHeaderIndex()
      Every symbol table entry is "defined" in relation to some section; this member holds the relevant section header table index.
      long getSize()
      Many symbols have associated sizes.
      ElfSymbolTable getSymbolTable()
      Get the symbol table containing this symbol
      int getSymbolTableIndex()
      Get the index of this symbol within the corresponding symbol table.
      byte getType()
      Returns the symbol's binding.
      long getValue()
      This member gives the value of the associated symbol.
      byte getVisibility()
      Returns the symbol's visibility.
      int hashCode()  
      void initSymbolName​(FactoryBundledWithBinaryReader reader, ElfStringTable stringTable)
      Initialize the string name of the symbol.
      boolean isAbsolute()
      Returns true if the symbol has an absolute value that will not change because of relocation.
      boolean isCommon()
      The symbol labels a common block that has not yet been allocated.
      boolean isExternal()
      Returns true if this is an external symbol.
      boolean isFile()
      Returns true if this symbol defines a file.
      boolean isFunction()
      Returns true if this symbol defines a function.
      boolean isGlobal()
      Returns true if this symbol is global.
      boolean isLocal()
      Returns true if this symbol is local.
      boolean isNoType()
      Returns true if this symbol's type is not specified.
      boolean isObject()
      Returns true if this symbol defines an object.
      boolean isSection()
      Returns true if this symbol defines a section.
      boolean isTLS()
      Returns true if this symbol defines a thread-local symbol.
      boolean isWeak()
      Returns true if this symbol is weak.
      void setValue​(long value)
      Sets the value of this symbol.
      byte[] toBytes​(DataConverter dc)
      Returns a byte array representing this implementor of this interface.
      java.lang.String toString()  
      • Methods inherited from class java.lang.Object

        clone, finalize, getClass, notify, notifyAll, wait, wait, wait
    • Field Detail

      • STB_LOCAL

        public static final byte STB_LOCAL
        Local symbols are not visible outside the object file containing their definition.
        See Also:
        Constant Field Values
      • STB_GLOBAL

        public static final byte STB_GLOBAL
        Global symbols are visible to all object files being combined.
        See Also:
        Constant Field Values
      • STB_WEAK

        public static final byte STB_WEAK
        Weak symbols resemble global symbols, but their definitions have lower precedence.
        See Also:
        Constant Field Values
      • STB_GNU_UNIQUE

        public static final byte STB_GNU_UNIQUE
        Symbol is unique in namespace.
        See Also:
        Constant Field Values
      • STT_NOTYPE

        public static final byte STT_NOTYPE
        The symbol's type is not specified.
        See Also:
        Constant Field Values
      • STT_OBJECT

        public static final byte STT_OBJECT
        The symbol is associated with a data object, such as a variable, an array, etc.
        See Also:
        Constant Field Values
      • STT_FUNC

        public static final byte STT_FUNC
        The symbol is associated with a function or other executable code.
        See Also:
        Constant Field Values
      • STT_SECTION

        public static final byte STT_SECTION
        The symbol is associated with a section. (Used for relocation and normally have STB_LOCAL binding.)
        See Also:
        Constant Field Values
      • STT_FILE

        public static final byte STT_FILE
        The symbol's name gives the name of the source file associated with the object file.
        See Also:
        Constant Field Values
      • STT_COMMON

        public static final byte STT_COMMON
        An uninitialized common block
        See Also:
        Constant Field Values
      • STT_TLS

        public static final byte STT_TLS
        In object files: st_value contains offset from the beginning of the section In DSOs: st_value contains offset in the TLS initialization image (inside of .tdata)
        See Also:
        Constant Field Values
      • STT_RELC

        public static final byte STT_RELC
        Symbol is in support of complex relocation.
        See Also:
        Constant Field Values
      • STT_SRELC

        public static final byte STT_SRELC
        Symbol is in support of complex relocation (signed value).
        See Also:
        Constant Field Values
      • STV_DEFAULT

        public static final byte STV_DEFAULT
        Default symbol visibility rules
        See Also:
        Constant Field Values
      • STV_INTERNAL

        public static final byte STV_INTERNAL
        Processor specific hidden class
        See Also:
        Constant Field Values
      • STV_HIDDEN

        public static final byte STV_HIDDEN
        Sym unavailable in other modules
        See Also:
        Constant Field Values
      • STV_PROTECTED

        public static final byte STV_PROTECTED
        Not preemptible, not exported
        See Also:
        Constant Field Values
    • Constructor Detail

      • ElfSymbol

        public ElfSymbol()
        DO NOT USE THIS CONSTRUCTOR, USE create*(GenericFactory ...) FACTORY METHODS INSTEAD.
    • Method Detail

      • createElfSymbol

        public static ElfSymbol createElfSymbol​(FactoryBundledWithBinaryReader reader,
                                                int symbolIndex,
                                                ElfSymbolTable symbolTable,
                                                ElfHeader header)
                                         throws java.io.IOException
        create an ElfSymbol() Warning! the routine initSymbolName() must be called on the symbol later to initialize the string name. This is a performance enhancement.
        Parameters:
        reader - to read symbol from
        symbolIndex - index of the symbol to read
        symbolTable - symbol table to associate the symbol to
        header - else header
        Returns:
        newly created ElfSymbol
        Throws:
        java.io.IOException - if an issue with reading occurs
      • createSectionSymbol32

        public static ElfSymbol createSectionSymbol32​(ElfHeader header,
                                                      long sectionAddress,
                                                      short sectionHeaderIndex,
                                                      java.lang.String name,
                                                      int symbolIndex,
                                                      ElfSymbolTable symbolTable)
        Creates a new section symbol.
        Parameters:
        header - the corresponding ELF header
        sectionAddress - the start address of the section
        sectionHeaderIndex - the index of the section in the section header table
        name - the string name of the section
        symbolIndex - index of symbol within corresponding symbol table
        symbolTable - symbol table
        Returns:
        the new section symbol
      • createGlobalFunctionSymbol

        public static ElfSymbol createGlobalFunctionSymbol​(ElfHeader header,
                                                           int name,
                                                           java.lang.String nameAsString,
                                                           long addr,
                                                           int symbolIndex,
                                                           ElfSymbolTable symbolTable)
        Creates a new global function symbol.
        Parameters:
        header - the corresponding ELF header
        name - the byte index of the name
        nameAsString - the string name of the section
        addr - the address of the function
        symbolIndex - index of symbol within corresponding symbol table
        symbolTable - symbol table
        Returns:
        the new global function symbol
      • initSymbolName

        public void initSymbolName​(FactoryBundledWithBinaryReader reader,
                                   ElfStringTable stringTable)
        Initialize the string name of the symbol. NOTE: This routine MUST be called for each ELFSymbol after the elf symbols have been created. This is done separately from the initial symbol entry read because the string names are in a separate location. If they are read at the same time the reading buffer will jump around and significantly degrade reading performance.
        Parameters:
        reader - to read from
        stringTable - stringTable to initialize symbol name
      • getSymbolTable

        public ElfSymbolTable getSymbolTable()
        Get the symbol table containing this symbol
        Returns:
        symbol table
      • getSymbolTableIndex

        public int getSymbolTableIndex()
        Get the index of this symbol within the corresponding symbol table.
        Returns:
        index of this symbol within the corresponding symbol table
      • isNoType

        public boolean isNoType()
        Returns true if this symbol's type is not specified.
        Returns:
        true if this symbol's type is not specified
      • hashCode

        public int hashCode()
        Overrides:
        hashCode in class java.lang.Object
      • equals

        public boolean equals​(java.lang.Object obj)
        Overrides:
        equals in class java.lang.Object
      • isLocal

        public boolean isLocal()
        Returns true if this symbol is local. Local symbols are not visible outside the object file containing their definition. Local symbols of the same name may exist in multiple files without colliding.
        Returns:
        true if this symbol is local
      • isGlobal

        public boolean isGlobal()
        Returns true if this symbol is global. Global symbols are visible to all object files being combined. One object file's definition of a global symbol will satisfy another file's undefined reference to the same global symbol.
        Returns:
        true if this symbol is global
      • isWeak

        public boolean isWeak()
        Returns true if this symbol is weak. Weak symbols resemble global symbols, but their definitions have lower precedence.
        Returns:
        true if this symbol is weak
      • isExternal

        public boolean isExternal()
        Returns true if this is an external symbol. A symbol is considered external if it's binding is global and it's size is zero.
        Returns:
        true if this is an external symbol
      • isSection

        public boolean isSection()
        Returns true if this symbol defines a section.
        Returns:
        true if this symbol defines a section
      • isFunction

        public boolean isFunction()
        Returns true if this symbol defines a function.
        Returns:
        true if this symbol defines a function
      • isObject

        public boolean isObject()
        Returns true if this symbol defines an object.
        Returns:
        true if this symbol defines an object
      • isFile

        public boolean isFile()
        Returns true if this symbol defines a file.
        Returns:
        true if this symbol defines a file
      • isTLS

        public boolean isTLS()
        Returns true if this symbol defines a thread-local symbol.
        Returns:
        true if this symbol defines a thread-local symbol
      • isAbsolute

        public boolean isAbsolute()
        Returns true if the symbol has an absolute value that will not change because of relocation.
        Returns:
        true if the symbol value will not change due to relocation
      • isCommon

        public boolean isCommon()
        The symbol labels a common block that has not yet been allocated. The symbol's value gives alignment constraints, similar to a section's sh_addralign member. That is, the link editor will allocate the storage for the symbol at an address that is a multiple of st_value. The symbol's size tells how many bytes are required.
        Returns:
        true if this is a common symbol
      • getInfo

        public byte getInfo()
        This member specifies the symbol's type and binding attributes.
        Returns:
        the symbol's type and binding attributes
      • getVisibility

        public byte getVisibility()
        Returns the symbol's visibility. For example, default.
        Returns:
        the symbol's visibility
      • getBind

        public byte getBind()
        Returns the symbol's binding. For example, global.
        Returns:
        the symbol's binding
      • getType

        public byte getType()
        Returns the symbol's binding. For example, section.
        Returns:
        the symbol's binding
      • getName

        public int getName()
        This member holds an index into the object file's symbol string table, which holds the character representations of the symbol names. If the value is non-zero, it represents a string table index that gives the symbol name. Otherwise, the symbol table entry has no name.
        Returns:
        the index to the symbol's name
      • getNameAsString

        public java.lang.String getNameAsString()
        Returns the actual string name for this symbol. The symbol only stores an byte index into the string table where the name string is located.
        Returns:
        the actual string name for this symbol
      • getOther

        public byte getOther()
        This member currently holds 0 and has no defined meaning.
        Returns:
        no defined meaning
      • getSectionHeaderIndex

        public short getSectionHeaderIndex()
        Every symbol table entry is "defined" in relation to some section; this member holds the relevant section header table index.
        Returns:
        the relevant section header table index
      • getSize

        public long getSize()
        Many symbols have associated sizes. For example, a data object's size is the number of bytes contained in the object. This member holds 0 if the symbol has no size or an unknown size.
        Returns:
        the symbol's size
      • getValue

        public long getValue()
        This member gives the value of the associated symbol. Depending on the context, this may be an absolute value, an address, etc.
        Returns:
        the symbol's value
      • toString

        public java.lang.String toString()
        Overrides:
        toString in class java.lang.Object
        See Also:
        Object.toString()
      • setValue

        public void setValue​(long value)
        Sets the value of this symbol. The value is generally an address.
        Parameters:
        value - the new value of the symbol