ROSE
0.9.6a
|
#include <BinaryLoaderElf.h>
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< Exception > | FixupErrors |
Public Member Functions | |
BinaryLoaderElf () | |
BinaryLoaderElf (const BinaryLoaderElf &other) | |
virtual | ~BinaryLoaderElf () |
virtual BinaryLoaderElf * | clone () 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 SgAsmGenericSection * | find_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 BinaryLoader * | lookup (SgAsmGenericHeader *) |
Finds a suitable loader. More... | |
static BinaryLoader * | lookup (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 SgAsmGenericFile * | createAsmAST (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... | |
SgAsmElfSymbol * | fixup_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... | |
Definition at line 6 of file BinaryLoaderElf.h.
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.
|
inline |
Definition at line 8 of file BinaryLoaderElf.h.
Referenced by clone().
|
inline |
Definition at line 10 of file BinaryLoaderElf.h.
|
inlinevirtual |
Definition at line 14 of file BinaryLoaderElf.h.
|
inlinevirtual |
Copy constructor.
See super class.
Reimplemented from BinaryLoader.
Reimplemented in BinaryLoaderElfObj.
Definition at line 17 of file BinaryLoaderElf.h.
References BinaryLoaderElf().
|
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:
|
static |
Returns the strings associated with certain variables in the ".dynamic" section.
|
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 |
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.
|
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.
|
protectedvirtual |
Returns a new, temporary base address which is greater than everything that's been mapped already.
Reimplemented from BinaryLoader.
|
protectedvirtual |
Linux-specific ELF Segment and Section alignment.
Reimplemented from BinaryLoader.
Reimplemented in BinaryLoaderElfObj.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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:
In addition to the primary return value, these additional values are returned through pointers when the pointer is non-null:
target_va_t
is the virtual address where the relocation should be applied. See fixup_info_target_va(). 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.
|
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.
|
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.
|
protected |
|
protected |
|
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.