ROSE  0.9.6a
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
BinaryLoaderElf Class Reference

#include <BinaryLoaderElf.h>

Inheritance diagram for BinaryLoaderElf:
Collaboration diagram for BinaryLoaderElf:

Classes

class  SymbolMap
 A mapping from symbol name (with optional version in parentheses) to SymbolMapEntry. More...
 
struct  SymbolMapEntry
 An entry for a SymbolMap. More...
 
class  SymverResolver
 
class  VersionedSymbol
 Symbol from .dynsym combined with additional information. More...
 

Public Types

enum  {
  VER_FLG_BASE =0x1,
  VER_FLG_WEAK =0x2,
  VERSYM_HIDDEN =0x8000
}
 Flags for version definitions and requirements. More...
 
- Public Types inherited from BinaryLoader
enum  MappingContribution {
  CONTRIBUTE_NONE,
  CONTRIBUTE_ADD,
  CONTRIBUTE_SUB
}
 Describes how a section contributes to the overall memory map. More...
 
enum  ConflictResolution {
  RESOLVE_THROW,
  RESOLVE_OVERMAP,
  RESOLVE_REMAP,
  RESOLVE_REMAP_ABOVE
}
 Describes how conflicts are resolved when mapping a section. More...
 
typedef std::vector< ExceptionFixupErrors
 

Public Member Functions

 BinaryLoaderElf ()
 
 BinaryLoaderElf (const BinaryLoaderElf &other)
 
virtual ~BinaryLoaderElf ()
 
virtual BinaryLoaderElfclone () const
 Copy constructor. More...
 
virtual bool can_load (SgAsmGenericHeader *) const
 Capability query. More...
 
void add_lib_defaults (SgAsmGenericHeader *header=NULL)
 Sets up library search paths and preloads from the environment. More...
 
virtual void fixup (SgAsmInterpretation *interp, FixupErrors *errors=NULL)
 Performs relocation fixups on the specified interpretation. More...
 
virtual SgAsmGenericSectionfind_section_by_preferred_va (SgAsmGenericHeader *, rose_addr_t va)
 Find the section containing the specified virtual address. More...
 
- Public Member Functions inherited from BinaryLoader
 BinaryLoader ()
 
 BinaryLoader (const BinaryLoader &other)
 
virtual ~BinaryLoader ()
 
void set_perform_dynamic_linking (bool b)
 Set whether this loader will perform the linking step. More...
 
bool get_perform_dynamic_linking () const
 Returns whether this loader will perform the linking step. More...
 
void set_perform_remap (bool b)
 Set whether this loader will perform the mapping step. More...
 
bool get_perform_remap () const
 Returns whether this loader will perform the mapping step. More...
 
void set_perform_relocations (bool b)
 Set whether this loader will perform the relocation step. More...
 
bool get_perform_relocations () const
 Returns whether this loader will perform the relocation step. More...
 
void set_debug (FILE *f)
 Set whether this loader will emit diagnostics for debugging. More...
 
FILE * get_debug () const
 Returns whether this loader will emit diagnostics for debugging. More...
 
void add_preload (const std::string &libname)
 Adds a library to the list of pre-loaded libraries. More...
 
const std::vector< std::string > & get_preloads () const
 Returns the list of libraries that will be pre-loaded. More...
 
void add_directory (const std::string &dirname)
 Adds a directory to the list of directories searched for libraries. More...
 
void add_directories (const std::vector< std::string > &dirnames)
 Adds directories to the list of directories searched for libraries. More...
 
const std::vector< std::string > & get_directories () const
 Returns the list of shared object search directories. More...
 
virtual std::string find_so_file (const std::string &libname) const
 Given the name of a shared object, return the fully qualified name where the library is located in the file system. More...
 
virtual void load (SgAsmInterpretation *)
 Conditionally parse, map, link, and/or relocate the interpretation according to properties of this loader. More...
 
virtual void link (SgAsmInterpretation *interp)
 Links an interpretation by parsing all shared objects required by that interpretation. More...
 
virtual void remap (SgAsmInterpretation *interp)
 Maps sections of the interpretation into the virtual address space. More...
 
virtual bool is_linked (SgBinaryComposite *composite, const std::string &filename)
 Returns true if the specified file name is already linked into the AST. More...
 
virtual bool is_linked (SgAsmInterpretation *interp, const std::string &filename)
 Returns true if the specified file name is already linked into the AST. More...
 
virtual std::vector< std::string > dependencies (SgAsmGenericHeader *)
 Finds shared object dependencies of a single binary header. More...
 
virtual void remap (MemoryMap *, SgAsmGenericHeader *)
 Remaps the sections for a particular header. More...
 
rose_addr_t bialign (rose_addr_t val1, rose_addr_t align1, rose_addr_t val2, rose_addr_t align2)
 Calculate adjustment to cause two values to be aligned to two different alignments. More...
 
virtual void addSectionsForRemap (SgAsmGenericHeader *header, SgAsmGenericSectionPtrList &allSections)
 Selects those sections which should be layed out by the Loader and inserts them into the allSections argument. More...
 

Static Public Member Functions

static void get_dynamic_vars (SgAsmGenericHeader *, std::string &rpath, std::string &runpath)
 Returns the strings associated with certain variables in the ".dynamic" section. More...
 
- Static Public Member Functions inherited from BinaryLoader
static void register_subclass (BinaryLoader *)
 Register a loader instance. More...
 
static BinaryLoaderlookup (SgAsmGenericHeader *)
 Finds a suitable loader. More...
 
static BinaryLoaderlookup (SgAsmInterpretation *)
 Finds a suitable loader. More...
 
static void load (SgBinaryComposite *composite, bool read_executable_file_format_only=false)
 Class method to parse, map, link, and/or relocate all interpretations of the specified binary composite. More...
 
static SgAsmGenericFilecreateAsmAST (SgBinaryComposite *composite, std::string filePath)
 Parses a single binary file. More...
 
static int64_t gcd (int64_t a, int64_t b, int64_t *x=NULL, int64_t *y=NULL)
 Extended Euclid Algorithm. More...
 
static SgAsmGenericHeaderPtrList findSimilarHeaders (SgAsmGenericHeader *matchHeader, SgAsmGenericHeaderPtrList &candidateHeaders)
 Find all headers in candidateHeaders that are similar to matchHeader. More...
 
static bool isHeaderSimilar (SgAsmGenericHeader *, SgAsmGenericHeader *)
 Determines whether two headers are similar enough to be in the same interpretation. More...
 

Protected Member Functions

virtual SgAsmGenericSectionPtrList get_remap_sections (SgAsmGenericHeader *)
 Returns mappable sections in a particular order. More...
 
virtual rose_addr_t rebase (MemoryMap *, SgAsmGenericHeader *, const SgAsmGenericSectionPtrList &)
 Returns a new, temporary base address which is greater than everything that's been mapped already. More...
 
virtual MappingContribution align_values (SgAsmGenericSection *, MemoryMap *, rose_addr_t *malign_lo, rose_addr_t *malign_hi, rose_addr_t *va, rose_addr_t *mem_size, rose_addr_t *offset, rose_addr_t *file_size, bool *map_private, rose_addr_t *va_offset, bool *anon_lo, bool *anon_hi, ConflictResolution *resolve)
 Linux-specific ELF Segment and Section alignment. More...
 
void build_master_symbol_table (SgAsmInterpretation *)
 Builds the master symbol table. More...
 
SgAsmElfSymbolfixup_info_reloc_symbol (SgAsmElfRelocEntry *, const SymverResolver &)
 Returns the defining symbol for a relocation, if any. More...
 
rose_addr_t fixup_info_target_va (SgAsmElfRelocEntry *, SgAsmGenericSection **section_p=NULL, rose_addr_t *adj_p=NULL)
 Returns the virtual address where a relocation should be supplied. More...
 
rose_addr_t fixup_info_symbol_va (SgAsmElfSymbol *, SgAsmGenericSection **section_p=NULL, rose_addr_t *adj_p=NULL)
 Returns the virtual address of a symbol adjusted for remapping. More...
 
rose_addr_t fixup_info_addend (SgAsmElfRelocEntry *, rose_addr_t target_va, MemoryMap *, size_t nbytes=0)
 Returns the addend associated with a relocation. More...
 
rose_addr_t fixup_info_expr (const std::string &expression, SgAsmElfRelocEntry *reloc, const SymverResolver &resolver, MemoryMap *memmap, rose_addr_t *target_va_p=NULL)
 Evaluates a simple postfix expression and returns the result. More...
 
void fixup_apply (rose_addr_t value, SgAsmElfRelocEntry *, MemoryMap *, rose_addr_t target_va=0, size_t nbytes=0)
 Writes a value into memory at the relocation target. More...
 
void fixup_apply_symbol_copy (SgAsmElfRelocEntry *, const SymverResolver &, MemoryMap *)
 Copies symbol memory to the relocation target. More...
 
void performRelocation (SgAsmElfRelocEntry *, const SymverResolver &, MemoryMap *)
 
void performRelocations (SgAsmElfFileHeader *, MemoryMap *)
 

Protected Attributes

SymbolMap p_symbols
 Symbol table for an entire interpretation. More...
 

Detailed Description

Definition at line 6 of file BinaryLoaderElf.h.

Member Enumeration Documentation

anonymous enum

Flags for version definitions and requirements.

Enumerator
VER_FLG_BASE 
VER_FLG_WEAK 
VERSYM_HIDDEN 

Definition at line 49 of file BinaryLoaderElf.h.

Constructor & Destructor Documentation

BinaryLoaderElf::BinaryLoaderElf ( )
inline

Definition at line 8 of file BinaryLoaderElf.h.

Referenced by clone().

BinaryLoaderElf::BinaryLoaderElf ( const BinaryLoaderElf other)
inline

Definition at line 10 of file BinaryLoaderElf.h.

virtual BinaryLoaderElf::~BinaryLoaderElf ( )
inlinevirtual

Definition at line 14 of file BinaryLoaderElf.h.

Member Function Documentation

virtual BinaryLoaderElf* BinaryLoaderElf::clone ( ) const
inlinevirtual

Copy constructor.

See super class.

Reimplemented from BinaryLoader.

Reimplemented in BinaryLoaderElfObj.

Definition at line 17 of file BinaryLoaderElf.h.

References BinaryLoaderElf().

virtual bool BinaryLoaderElf::can_load ( SgAsmGenericHeader ) const
virtual

Capability query.

See super class.

Reimplemented from BinaryLoader.

Reimplemented in BinaryLoaderElfObj.

void BinaryLoaderElf::add_lib_defaults ( SgAsmGenericHeader header = NULL)

Sets up library search paths and preloads from the environment.

The search paths and preloads are added to the end of the lists. If an ELF file header is provided, then the DT_RPATH and DT_RUNPATH from the ".dynamic" section are also used.

Caveats:

  • The LD_PRELOAD and LD_LIBRARY_PATH environment variables are always consulted, even if the specimen is setuid.
  • The library cache files (/etc/ld.so.*) are never consulted.
  • No special behavior for specimens linked with "-z nodeflib" (not sure how to detect this.)
  • The virtual dynamic shared object (vdso, linux-gate.so, etc) is not loaded.
  • Since the environment variables that are consulted by this method are the very same ones used by the real loader-linker, it's not possible to fully control this method without also affecting the loading of ROSE itself.
static void BinaryLoaderElf::get_dynamic_vars ( SgAsmGenericHeader ,
std::string &  rpath,
std::string &  runpath 
)
static

Returns the strings associated with certain variables in the ".dynamic" section.

virtual void BinaryLoaderElf::fixup ( SgAsmInterpretation interp,
FixupErrors errors = NULL 
)
virtual

Performs relocation fixups on the specified interpretation.

This should be called after sections are mapped into memory by remap(). If an error occurs, then this function either throws the error (BinaryLoader::Exception) or appends it to the errors container (if errors is non-null).

Reimplemented from BinaryLoader.

virtual SgAsmGenericSection* BinaryLoaderElf::find_section_by_preferred_va ( SgAsmGenericHeader ,
rose_addr_t  va 
)
virtual

Find the section containing the specified virtual address.

Only ELF Sections of the specified header are searched, and we search based on the preferred mapping location of the section (not the actual mapping location). The null pointer is returned if no suitable section can be found.

virtual SgAsmGenericSectionPtrList BinaryLoaderElf::get_remap_sections ( SgAsmGenericHeader )
protectedvirtual

Returns mappable sections in a particular order.

Returns ELF Segments in the order they are defined in the segment table, followed by ELF Sections in the order they are defined in the section table but excluding those sections that were already added to the list as ELF Segments.

Reimplemented from BinaryLoader.

Reimplemented in BinaryLoaderElfObj.

virtual rose_addr_t BinaryLoaderElf::rebase ( MemoryMap ,
SgAsmGenericHeader ,
const SgAsmGenericSectionPtrList  
)
protectedvirtual

Returns a new, temporary base address which is greater than everything that's been mapped already.

Reimplemented from BinaryLoader.

virtual MappingContribution BinaryLoaderElf::align_values ( SgAsmGenericSection ,
MemoryMap ,
rose_addr_t malign_lo,
rose_addr_t malign_hi,
rose_addr_t va,
rose_addr_t mem_size,
rose_addr_t offset,
rose_addr_t file_size,
bool *  map_private,
rose_addr_t va_offset,
bool *  anon_lo,
bool *  anon_hi,
ConflictResolution resolve 
)
protectedvirtual

Linux-specific ELF Segment and Section alignment.

Reimplemented from BinaryLoader.

Reimplemented in BinaryLoaderElfObj.

void BinaryLoaderElf::build_master_symbol_table ( SgAsmInterpretation )
protected

Builds the master symbol table.

This table is built just before relocations are fixed up and contains information about all the symbols that might be necessary during that process. The symbol table describes one entire interpretation.

SgAsmElfSymbol* BinaryLoaderElf::fixup_info_reloc_symbol ( SgAsmElfRelocEntry ,
const SymverResolver  
)
protected

Returns the defining symbol for a relocation, if any.

The relocation optionally points to a symbol under the same file header as the relocation. We then consult the supplied resolver to find a defining symbol under a possibly different file header of the same interpretation. The defining symbol is returned.

If the relocation does not refer to a symbol, or the symbol is weak with no definition then a null pointer is returned. Otherwise, if a defining symbol cannot be located via the resolver, then an Exception is thrown.

Debugging information is conditionally output and indented four spaces.

rose_addr_t BinaryLoaderElf::fixup_info_target_va ( SgAsmElfRelocEntry ,
SgAsmGenericSection **  section_p = NULL,
rose_addr_t adj_p = NULL 
)
protected

Returns the virtual address where a relocation should be supplied.

The relocation address is computed by treating the relocation offset as a virtual address, finding the section that would have contained that virtual address had all sections of the relocation's header been mapped at their preferred addresses, and returning the sum of the relocation offset with the difference between the section's actual and preferred mapping addresses. The section and adjustment are optionally returned through the section_p and adj_p pointer arguments.

If no section can be found for the relocation offset then an Exception is thrown.

Debugging information is conditionally output and indented four spaces.

rose_addr_t BinaryLoaderElf::fixup_info_symbol_va ( SgAsmElfSymbol ,
SgAsmGenericSection **  section_p = NULL,
rose_addr_t adj_p = NULL 
)
protected

Returns the virtual address of a symbol adjusted for remapping.

The return value is computed by treating the symbol value as a virtual address, finding the section that would have contained that virtual address had all sections of the symbol's header been mapped at their preferred addresses, and returning the sum of the symbol value with the difference between the section's actual and preferred mapping addresses. The section and adjustment are optionally returned through the section_p and adj_p pointer arguments.

If no section can be found for the relocation offset then an Exception is thrown.

Debugging information is conditionally output and indented four spaces.

rose_addr_t BinaryLoaderElf::fixup_info_addend ( SgAsmElfRelocEntry ,
rose_addr_t  target_va,
MemoryMap ,
size_t  nbytes = 0 
)
protected

Returns the addend associated with a relocation.

If the relocation appears in a RELA relocation section then the addend is that which is specified in the relocation entry itself. Otherwise the supplied relocation target virtual address and memory map are used to read the addend from specimen memory.

The nbytes arguments indicates how many bytes are read from the specimen's memory if the relocation is not of the RELA variety. If the size is zero (the default) then it is obtained from the relocation's file header. The byte sex is always obtained from information in the relocation's file header.

An Exception is thrown if an attempt is made to read from memory which is not mapped or not readable.

rose_addr_t BinaryLoaderElf::fixup_info_expr ( const std::string &  expression,
SgAsmElfRelocEntry reloc,
const SymverResolver resolver,
MemoryMap memmap,
rose_addr_t target_va_p = NULL 
)
protected

Evaluates a simple postfix expression and returns the result.

The expression consists of terms, operators, and settings each consisting of a single character. They are defined as follows, and for the most part match various linker documentation from Sun Microsystems "Linker and Libraries Guide", April 2008, page 239:

  • "0", "4", and "8" are settings for the size (in bytes) of memory accesses when performing operations such as reading addend values from specimen memory. The default "0" indicates that the size should be determined from the word size specified by the relocation entrie's file header.
  • "A" is the addend used to compute the value of the relocatable field. See fixup_info_addend(). The size of the addend is determined from the current nbytes setting.
  • "B" is the base address at which a shared object is loaded into memory during execution. Generally, a shared object file is built with a base virtual address of zero. However, the execution address of the shared object is different. See the adjustment argument of fixup_info_symbol_va().
  • "S" is the value of the symbol whose index resides in the relocation entry. Specifically, this is the value of the associated defining symbol adjusted for remapping. See fixup_info_symbol_va().
  • "+" replaces the top two values of the stack with their sum.
  • "-" replaces the top two values of the stack with their difference, subtracting the top value from the second-to-top value.

In addition to the primary return value, these additional values are returned through pointers when the pointer is non-null:

Debugging information is conditionally emitted and indented four spaces. Most debugging information comes from the underlying fixup_info_* methods that are called.

Exceptions are thrown when something goes wrong. Most exceptions come from the underlying fixup_info_* methods.

void BinaryLoaderElf::fixup_apply ( rose_addr_t  value,
SgAsmElfRelocEntry ,
MemoryMap ,
rose_addr_t  target_va = 0,
size_t  nbytes = 0 
)
protected

Writes a value into memory at the relocation target.

The target virtual address is either specified by a non-zero value for the target_va argument, or (re)computed from the supplied relocation entry. This method is usually called by the othe fixup_apply_* methods. The value is truncated and/or byte-swapped if necessary according to the file header containing the relocation entry. If nbytes is zero (the default) then the size will be determined from the relocation's file header.

Debugging information is conditionally emitted and indented four spaces.

An Exception is thrown if the value cannot be written to the specimen memory due to memory not being mapped or not being writable.

void BinaryLoaderElf::fixup_apply_symbol_copy ( SgAsmElfRelocEntry ,
const SymverResolver ,
MemoryMap  
)
protected

Copies symbol memory to the relocation target.

This is usually used to copy initialized library data (initialized by the loader calling a constructor) into a common location in the executable's .bss.

void BinaryLoaderElf::performRelocation ( SgAsmElfRelocEntry ,
const SymverResolver ,
MemoryMap  
)
protected
void BinaryLoaderElf::performRelocations ( SgAsmElfFileHeader ,
MemoryMap  
)
protected

Member Data Documentation

SymbolMap BinaryLoaderElf::p_symbols
protected

Symbol table for an entire interpretation.

This symbol table is created by the fixup() method via build_master_symbol_table() and used by various relocation fixups.

Definition at line 401 of file BinaryLoaderElf.h.


The documentation for this class was generated from the following file: