LLDB mainline
Classes | Public Member Functions | Static Public Member Functions | Static Public Attributes | Protected Member Functions | Static Protected Member Functions | Private Types | Private Member Functions | Static Private Member Functions | Private Attributes | Static Private Attributes | List of all members
ObjectFileELF Class Reference

Generic COFF object file reader. More...

#include <ObjectFileELF.h>

Inheritance diagram for ObjectFileELF:
Inheritance graph
[legend]

Classes

struct  ELFDynamicWithName
 
struct  ELFSectionHeaderInfo
 

Public Member Functions

llvm::StringRef GetPluginName () override
 
bool isA (const void *ClassID) const override
 
bool ParseHeader () override
 Attempts to parse the object header.
 
bool SetLoadAddress (lldb_private::Target &target, lldb::addr_t value, bool value_is_offset) override
 Sets the load address for an entire module, assuming a rigid slide of sections, if possible in the implementation.
 
lldb::ByteOrder GetByteOrder () const override
 Gets whether endian swapping should occur when extracting data from this object file.
 
bool IsExecutable () const override
 Tells whether this object file is capable of being the main executable for a process.
 
uint32_t GetAddressByteSize () const override
 Gets the address size in bytes for the current object file.
 
lldb_private::AddressClass GetAddressClass (lldb::addr_t file_addr) override
 Get the address type given a file address in an object file.
 
void ParseSymtab (lldb_private::Symtab &symtab) override
 Parse the symbol table into the provides symbol table object.
 
bool IsStripped () override
 Detect if this object file has been stripped of local symbols.
 
void CreateSections (lldb_private::SectionList &unified_section_list) override
 
void Dump (lldb_private::Stream *s) override
 Dump a description of this object to a Stream.
 
lldb_private::ArchSpec GetArchitecture () override
 Get the ArchSpec for this object file.
 
lldb_private::UUID GetUUID () override
 Gets the UUID for this object file.
 
std::optional< lldb_private::FileSpecGetDebugLink ()
 Return the contents of the .gnu_debuglink section, if the object file contains it.
 
uint32_t GetDependentModules (lldb_private::FileSpecList &files) override
 Extract the dependent modules from an object file.
 
lldb_private::Address GetImageInfoAddress (lldb_private::Target *target) override
 Similar to Process::GetImageInfoAddress().
 
lldb_private::Address GetEntryPointAddress () override
 Returns the address of the Entry Point in this object file - if the object file doesn't have an entry point (because it is not an executable file) then an invalid address is returned.
 
lldb_private::Address GetBaseAddress () override
 Returns base address of this object file.
 
ObjectFile::Type CalculateType () override
 The object file should be able to calculate its type by looking at its file header and possibly the sections or other data in the object file.
 
ObjectFile::Strata CalculateStrata () override
 The object file should be able to calculate the strata of the object file.
 
size_t ReadSectionData (lldb_private::Section *section, lldb::offset_t section_offset, void *dst, size_t dst_len) override
 
size_t ReadSectionData (lldb_private::Section *section, lldb_private::DataExtractor &section_data) override
 
llvm::ArrayRef< elf::ELFProgramHeaderProgramHeaders ()
 
lldb_private::DataExtractor GetSegmentData (const elf::ELFProgramHeader &H)
 
llvm::StringRef StripLinkerSymbolAnnotations (llvm::StringRef symbol_name) const override
 
void RelocateSection (lldb_private::Section *section) override
 Perform relocations on the section if necessary.
 
- Public Member Functions inherited from lldb_private::ObjectFile
 ObjectFile (const lldb::ModuleSP &module_sp, const FileSpec *file_spec_ptr, lldb::offset_t file_offset, lldb::offset_t length, lldb::DataBufferSP data_sp, lldb::offset_t data_offset)
 Construct with a parent module, offset, and header data.
 
 ObjectFile (const lldb::ModuleSP &module_sp, const lldb::ProcessSP &process_sp, lldb::addr_t header_addr, lldb::DataBufferSP data_sp)
 
 ~ObjectFile () override
 Destructor.
 
virtual void Dump (Stream *s)=0
 Dump a description of this object to a Stream.
 
virtual bool isA (const void *ClassID) const
 
virtual uint32_t GetAddressByteSize () const =0
 Gets the address size in bytes for the current object file.
 
virtual AddressClass GetAddressClass (lldb::addr_t file_addr)
 Get the address type given a file address in an object file.
 
virtual uint32_t GetDependentModules (FileSpecList &file_list)=0
 Extract the dependent modules from an object file.
 
virtual bool IsExecutable () const =0
 Tells whether this object file is capable of being the main executable for a process.
 
virtual lldb::addr_t GetFileOffset () const
 Returns the offset into a file at which this object resides.
 
virtual lldb::addr_t GetByteSize () const
 
virtual FileSpecGetFileSpec ()
 Get accessor to the object file specification.
 
virtual const FileSpecGetFileSpec () const
 Get const accessor to the object file specification.
 
virtual ArchSpec GetArchitecture ()=0
 Get the ArchSpec for this object file.
 
virtual SectionListGetSectionList (bool update_module_section_list=true)
 Gets the section list for the currently selected architecture (and object for archives).
 
virtual void CreateSections (SectionList &unified_section_list)=0
 
virtual void SectionFileAddressesChanged ()
 Notify the ObjectFile that the file addresses in the Sections for this module have been changed.
 
SymtabGetSymtab ()
 Gets the symbol table for the currently selected architecture (and object for archives).
 
virtual void ParseSymtab (Symtab &symtab)=0
 Parse the symbol table into the provides symbol table object.
 
virtual void RelocateSection (lldb_private::Section *section)
 Perform relocations on the section if necessary.
 
virtual SymbolResolveSymbolForAddress (const Address &so_addr, bool verify_unique)
 Appends a Symbol for the specified so_addr to the symbol table.
 
virtual bool IsStripped ()=0
 Detect if this object file has been stripped of local symbols.
 
virtual void ClearSymtab ()
 Frees the symbol table.
 
virtual UUID GetUUID ()=0
 Gets the UUID for this object file.
 
virtual lldb_private::FileSpecList GetReExportedLibraries ()
 Gets the file spec list of libraries re-exported by this object file.
 
virtual bool SetLoadAddress (Target &target, lldb::addr_t value, bool value_is_offset)
 Sets the load address for an entire module, assuming a rigid slide of sections, if possible in the implementation.
 
virtual lldb::ByteOrder GetByteOrder () const =0
 Gets whether endian swapping should occur when extracting data from this object file.
 
virtual bool ParseHeader ()=0
 Attempts to parse the object header.
 
virtual bool AllowAssemblyEmulationUnwindPlans ()
 Returns if the function bounds for symbols in this symbol file are likely accurate.
 
virtual lldb_private::Address GetImageInfoAddress (Target *target)
 Similar to Process::GetImageInfoAddress().
 
virtual lldb_private::Address GetEntryPointAddress ()
 Returns the address of the Entry Point in this object file - if the object file doesn't have an entry point (because it is not an executable file) then an invalid address is returned.
 
virtual lldb_private::Address GetBaseAddress ()
 Returns base address of this object file.
 
virtual uint32_t GetNumThreadContexts ()
 
virtual std::string GetIdentifierString ()
 Some object files may have an identifier string embedded in them, e.g.
 
virtual lldb_private::AddressableBits GetAddressableBits ()
 Some object files may have the number of bits used for addressing embedded in them, e.g.
 
virtual bool GetCorefileMainBinaryInfo (lldb::addr_t &value, bool &value_is_offset, UUID &uuid, ObjectFile::BinaryType &type)
 When the ObjectFile is a core file, lldb needs to locate the "binary" in the core file.
 
virtual bool GetCorefileThreadExtraInfos (std::vector< lldb::tid_t > &tids)
 Get metadata about threads from the corefile.
 
virtual lldb::RegisterContextSP GetThreadContextAtIndex (uint32_t idx, lldb_private::Thread &thread)
 
virtual Type CalculateType ()=0
 The object file should be able to calculate its type by looking at its file header and possibly the sections or other data in the object file.
 
virtual void SetType (Type type)
 In cases where the type can't be calculated (elf files), this routine allows someone to explicitly set it.
 
virtual Strata CalculateStrata ()=0
 The object file should be able to calculate the strata of the object file.
 
virtual llvm::VersionTuple GetVersion ()
 Get the object file version numbers.
 
virtual llvm::VersionTuple GetMinimumOSVersion ()
 Get the minimum OS version this object file can run on.
 
virtual llvm::VersionTuple GetSDKVersion ()
 Get the SDK OS version this object file was built with.
 
virtual bool GetIsDynamicLinkEditor ()
 Return true if this file is a dynamic link editor (dyld)
 
Type GetType ()
 
Strata GetStrata ()
 
size_t GetData (lldb::offset_t offset, size_t length, DataExtractor &data) const
 
size_t CopyData (lldb::offset_t offset, size_t length, void *dst) const
 
virtual size_t ReadSectionData (Section *section, lldb::offset_t section_offset, void *dst, size_t dst_len)
 
virtual size_t ReadSectionData (Section *section, DataExtractor &section_data)
 
virtual size_t GetSectionDataSize (Section *section)
 
bool IsInMemory () const
 Returns true if the object file exists only in memory.
 
virtual llvm::StringRef StripLinkerSymbolAnnotations (llvm::StringRef symbol_name) const
 
virtual bool CanTrustAddressRanges ()
 Can we trust the address ranges accelerator associated with this object file to be complete.
 
virtual std::vector< LoadableDataGetLoadableData (Target &target)
 Loads this objfile to memory.
 
virtual std::unique_ptr< CallFrameInfoCreateCallFrameInfo ()
 Creates a plugin-specific call frame info.
 
virtual bool LoadCoreFileImages (lldb_private::Process &process)
 Load binaries listed in a corefile.
 
uint32_t GetCacheHash ()
 Get a hash that can be used for caching object file releated information.
 
- Public Member Functions inherited from lldb_private::PluginInterface
 PluginInterface ()=default
 
virtual ~PluginInterface ()=default
 
virtual llvm::StringRef GetPluginName ()=0
 
 PluginInterface (const PluginInterface &)=delete
 
PluginInterfaceoperator= (const PluginInterface &)=delete
 
- Public Member Functions inherited from lldb_private::ModuleChild
 ModuleChild (const lldb::ModuleSP &module_sp)
 Construct with owning module.
 
 ~ModuleChild ()
 Destructor.
 
const ModuleChildoperator= (const ModuleChild &rhs)
 Assignment operator.
 
lldb::ModuleSP GetModule () const
 Get const accessor for the module pointer.
 
void SetModule (const lldb::ModuleSP &module_sp)
 Set accessor for the module pointer.
 

Static Public Member Functions

static void Initialize ()
 
static void Terminate ()
 
static llvm::StringRef GetPluginNameStatic ()
 
static llvm::StringRef GetPluginDescriptionStatic ()
 
static lldb_private::ObjectFileCreateInstance (const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp, lldb::offset_t data_offset, const lldb_private::FileSpec *file, lldb::offset_t file_offset, lldb::offset_t length)
 
static lldb_private::ObjectFileCreateMemoryInstance (const lldb::ModuleSP &module_sp, lldb::WritableDataBufferSP data_sp, const lldb::ProcessSP &process_sp, lldb::addr_t header_addr)
 
static size_t GetModuleSpecifications (const lldb_private::FileSpec &file, lldb::DataBufferSP &data_sp, lldb::offset_t data_offset, lldb::offset_t file_offset, lldb::offset_t length, lldb_private::ModuleSpecList &specs)
 
static bool MagicBytesMatch (lldb::DataBufferSP &data_sp, lldb::addr_t offset, lldb::addr_t length)
 
static bool classof (const ObjectFile *obj)
 
- Static Public Member Functions inherited from lldb_private::ObjectFile
static lldb::ObjectFileSP FindPlugin (const lldb::ModuleSP &module_sp, const FileSpec *file_spec, lldb::offset_t file_offset, lldb::offset_t file_size, lldb::DataBufferSP &data_sp, lldb::offset_t &data_offset)
 Find a ObjectFile plug-in that can parse file_spec.
 
static lldb::ObjectFileSP FindPlugin (const lldb::ModuleSP &module_sp, const lldb::ProcessSP &process_sp, lldb::addr_t header_addr, lldb::WritableDataBufferSP file_data_sp)
 Find a ObjectFile plug-in that can parse a file in memory.
 
static size_t GetModuleSpecifications (const FileSpec &file, lldb::offset_t file_offset, lldb::offset_t file_size, ModuleSpecList &specs, lldb::DataBufferSP data_sp=lldb::DataBufferSP())
 
static size_t GetModuleSpecifications (const lldb_private::FileSpec &file, lldb::DataBufferSP &data_sp, lldb::offset_t data_offset, lldb::offset_t file_offset, lldb::offset_t file_size, lldb_private::ModuleSpecList &specs)
 
static bool IsObjectFile (lldb_private::FileSpec file_spec)
 
static bool SplitArchivePathWithObject (llvm::StringRef path_with_object, lldb_private::FileSpec &archive_file, lldb_private::ConstString &archive_object, bool must_exist)
 Split a path into a file path with object name.
 
static lldb::WritableDataBufferSP ReadMemory (const lldb::ProcessSP &process_sp, lldb::addr_t addr, size_t byte_size)
 
static lldb::SymbolType GetSymbolTypeFromName (llvm::StringRef name, lldb::SymbolType symbol_type_hint=lldb::eSymbolTypeUndefined)
 
static lldb::DataBufferSP MapFileData (const FileSpec &file, uint64_t Size, uint64_t Offset)
 

Static Public Attributes

static char ID
 
- Static Public Attributes inherited from lldb_private::ObjectFile
static char ID
 

Protected Member Functions

std::vector< LoadableDataGetLoadableData (lldb_private::Target &target) override
 Loads this objfile to memory.
 
- Protected Member Functions inherited from lldb_private::ObjectFile
bool SetModulesArchitecture (const ArchSpec &new_arch)
 Sets the architecture for a module.
 

Static Protected Member Functions

static lldb::WritableDataBufferSP MapFileDataWritable (const lldb_private::FileSpec &file, uint64_t Size, uint64_t Offset)
 

Private Types

typedef std::vector< elf::ELFProgramHeaderProgramHeaderColl
 
typedef std::vector< ELFSectionHeaderInfoSectionHeaderColl
 
typedef SectionHeaderColl::iterator SectionHeaderCollIter
 
typedef SectionHeaderColl::const_iterator SectionHeaderCollConstIter
 
typedef std::vector< ELFDynamicWithNameDynamicSymbolColl
 
typedef DynamicSymbolColl::iterator DynamicSymbolCollIter
 
typedef DynamicSymbolColl::const_iterator DynamicSymbolCollConstIter
 
typedef std::map< lldb::addr_t, lldb_private::AddressClassFileAddressToAddressClassMap
 An ordered map of file address to address class.
 

Private Member Functions

 ObjectFileELF (const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp, lldb::offset_t data_offset, const lldb_private::FileSpec *file, lldb::offset_t offset, lldb::offset_t length)
 
 ObjectFileELF (const lldb::ModuleSP &module_sp, lldb::DataBufferSP header_data_sp, const lldb::ProcessSP &process_sp, lldb::addr_t header_addr)
 
size_t SectionIndex (const SectionHeaderCollIter &I)
 Returns the index of the given section header.
 
size_t SectionIndex (const SectionHeaderCollConstIter &I) const
 Returns the index of the given section header.
 
bool ParseProgramHeaders ()
 Parses all section headers present in this object file and populates m_program_headers.
 
size_t ParseSectionHeaders ()
 Parses all section headers present in this object file and populates m_section_headers.
 
lldb::SectionType GetSectionType (const ELFSectionHeaderInfo &H) const
 
size_t ParseDependentModules ()
 Scans the dynamic section and locates all dependent modules (shared libraries) populating m_filespec_up.
 
size_t ParseDynamicSymbols ()
 Parses the dynamic symbol table and populates m_dynamic_symbols.
 
std::pair< unsigned, FileAddressToAddressClassMapParseSymbolTable (lldb_private::Symtab *symbol_table, lldb::user_id_t start_id, lldb_private::Section *symtab)
 Populates the symbol table with all non-dynamic linker symbols.
 
std::pair< unsigned, FileAddressToAddressClassMapParseSymbols (lldb_private::Symtab *symbol_table, lldb::user_id_t start_id, lldb_private::SectionList *section_list, const size_t num_symbols, const lldb_private::DataExtractor &symtab_data, const lldb_private::DataExtractor &strtab_data)
 Helper routine for ParseSymbolTable().
 
unsigned ParseTrampolineSymbols (lldb_private::Symtab *symbol_table, lldb::user_id_t start_id, const ELFSectionHeaderInfo *rela_hdr, lldb::user_id_t section_id)
 Scans the relocation entries and adds a set of artificial symbols to the given symbol table for each PLT slot.
 
void ParseUnwindSymbols (lldb_private::Symtab *symbol_table, lldb_private::DWARFCallFrameInfo *eh_frame)
 
unsigned RelocateDebugSections (const elf::ELFSectionHeader *rel_hdr, lldb::user_id_t rel_id, lldb_private::Symtab *thetab)
 Relocates debug sections.
 
unsigned ApplyRelocations (lldb_private::Symtab *symtab, const elf::ELFHeader *hdr, const elf::ELFSectionHeader *rel_hdr, const elf::ELFSectionHeader *symtab_hdr, const elf::ELFSectionHeader *debug_hdr, lldb_private::DataExtractor &rel_data, lldb_private::DataExtractor &symtab_data, lldb_private::DataExtractor &debug_data, lldb_private::Section *rel_section)
 
size_t GetSectionHeaderStringTable ()
 Loads the section name string table into m_shstr_data.
 
lldb::user_id_t GetSectionIndexByName (const char *name)
 Utility method for looking up a section given its name.
 
const ELFSectionHeaderInfoGetSectionHeaderByIndex (lldb::user_id_t id)
 Returns the section header with the given id or NULL.
 

Static Private Member Functions

static size_t GetProgramHeaderInfo (ProgramHeaderColl &program_headers, lldb_private::DataExtractor &object_data, const elf::ELFHeader &header)
 
static uint32_t CalculateELFNotesSegmentsCRC32 (const ProgramHeaderColl &program_headers, lldb_private::DataExtractor &data)
 
static void ParseARMAttributes (lldb_private::DataExtractor &data, uint64_t length, lldb_private::ArchSpec &arch_spec)
 
static size_t GetSectionHeaderInfo (SectionHeaderColl &section_headers, lldb_private::DataExtractor &object_data, const elf::ELFHeader &header, lldb_private::UUID &uuid, std::string &gnu_debuglink_file, uint32_t &gnu_debuglink_crc, lldb_private::ArchSpec &arch_spec)
 Parses the elf section headers and returns the uuid, debug link name, crc, archspec.
 
ELF header dump routines
static void DumpELFHeader (lldb_private::Stream *s, const elf::ELFHeader &header)
 
static void DumpELFHeader_e_ident_EI_DATA (lldb_private::Stream *s, unsigned char ei_data)
 
static void DumpELFHeader_e_type (lldb_private::Stream *s, elf::elf_half e_type)
 

Private Attributes

elf::ELFHeader m_header
 ELF file header.
 
lldb_private::UUID m_uuid
 ELF build ID.
 
std::string m_gnu_debuglink_file
 ELF .gnu_debuglink file and crc data if available.
 
uint32_t m_gnu_debuglink_crc = 0
 
ProgramHeaderColl m_program_headers
 Collection of program headers.
 
SectionHeaderColl m_section_headers
 Collection of section headers.
 
lldb::addr_t m_dynamic_base_addr = LLDB_INVALID_ADDRESS
 The file address of the .dynamic section.
 
DynamicSymbolColl m_dynamic_symbols
 Collection of symbols from the dynamic table.
 
std::shared_ptr< ObjectFileELFm_gnu_debug_data_object_file
 Object file parsed from .gnu_debugdata section (.
 
std::unique_ptr< lldb_private::FileSpecListm_filespec_up
 List of file specifications corresponding to the modules (shared libraries) on which this object file depends.
 
lldb_private::Address m_entry_point_address
 Cached value of the entry point for this module.
 
lldb_private::ArchSpec m_arch_spec
 The architecture detected from parsing elf file contents.
 
FileAddressToAddressClassMap m_address_class_map
 The address class for each symbol in the elf file.
 

Static Private Attributes

static const uint32_t m_plugin_version = 1
 Version of this reader common to all plugins based on this class.
 
static const uint32_t g_core_uuid_magic
 

ELF program header dump routines

void DumpELFProgramHeaders (lldb_private::Stream *s)
 
static void DumpELFProgramHeader (lldb_private::Stream *s, const elf::ELFProgramHeader &ph)
 
static void DumpELFProgramHeader_p_type (lldb_private::Stream *s, elf::elf_word p_type)
 
static void DumpELFProgramHeader_p_flags (lldb_private::Stream *s, elf::elf_word p_flags)
 

ELF section header dump routines

void DumpELFSectionHeaders (lldb_private::Stream *s)
 
void DumpDependentModules (lldb_private::Stream *s)
 ELF dependent module dump routine.
 
void DumpELFDynamic (lldb_private::Stream *s)
 ELF dump the .dynamic section.
 
const elf::ELFDynamicFindDynamicSymbol (unsigned tag)
 
unsigned PLTRelocationType ()
 
bool AnySegmentHasPhysicalAddress ()
 
std::shared_ptr< ObjectFileELFGetGnuDebugDataObjectFile ()
 Takes the .gnu_debugdata and returns the decompressed object file that is stored within that section.
 
std::optional< lldb_private::DataExtractorGetDynamicData ()
 Get the bytes that represent the .dynamic section.
 
std::optional< lldb_private::DataExtractorGetDynstrData ()
 Get the bytes that represent the dynamic string table data.
 
std::optional< lldb_private::DataExtractorReadDataFromDynamic (const elf::ELFDynamic *dyn, uint64_t length, uint64_t offset=0)
 Read the bytes pointed to by the dyn dynamic entry.
 
std::optional< lldb_private::DataExtractorGetDynsymDataFromDynamic (uint32_t &num_symbols)
 Get the bytes that represent the dynamic symbol table from the .dynamic section from process memory.
 
std::optional< uint32_t > GetNumSymbolsFromDynamicHash ()
 Get the number of symbols from the DT_HASH dynamic entry.
 
std::optional< uint32_t > GetNumSymbolsFromDynamicGnuHash ()
 Get the number of symbols from the DT_GNU_HASH dynamic entry.
 
static void DumpELFSectionHeader (lldb_private::Stream *s, const ELFSectionHeaderInfo &sh)
 
static void DumpELFSectionHeader_sh_type (lldb_private::Stream *s, elf::elf_word sh_type)
 
static void DumpELFSectionHeader_sh_flags (lldb_private::Stream *s, elf::elf_xword sh_flags)
 
static lldb_private::Status RefineModuleDetailsFromNote (lldb_private::DataExtractor &data, lldb_private::ArchSpec &arch_spec, lldb_private::UUID &uuid)
 

Additional Inherited Members

- Public Types inherited from lldb_private::ObjectFile
enum  Type {
  eTypeInvalid = 0 , eTypeCoreFile , eTypeExecutable , eTypeDebugInfo ,
  eTypeDynamicLinker , eTypeObjectFile , eTypeSharedLibrary , eTypeStubLibrary ,
  eTypeJIT , eTypeUnknown
}
 
enum  Strata {
  eStrataInvalid = 0 , eStrataUnknown , eStrataUser , eStrataKernel ,
  eStrataRawImage , eStrataJIT
}
 
enum  BinaryType {
  eBinaryTypeInvalid = 0 , eBinaryTypeUnknown , eBinaryTypeKernel , eBinaryTypeUser ,
  eBinaryTypeStandalone
}
 If we have a corefile binary hint, this enum specifies the binary type which we can use to select the correct DynamicLoader plugin. More...
 
- Protected Attributes inherited from lldb_private::ObjectFile
FileSpec m_file
 
Type m_type
 
Strata m_strata
 
lldb::addr_t m_file_offset
 The offset in bytes into the file, or the address in memory.
 
lldb::addr_t m_length
 The length of this object file if it is known (can be zero if length is unknown or can't be determined).
 
DataExtractor m_data
 The data for this object file so things can be parsed lazily.
 
lldb::ProcessWP m_process_wp
 
const lldb::addr_t m_memory_addr
 Set if the object file only exists in memory.
 
std::unique_ptr< lldb_private::SectionListm_sections_up
 
std::unique_ptr< lldb_private::Symtabm_symtab_up
 
std::unique_ptr< llvm::once_flag > m_symtab_once_up
 We need a llvm::once_flag that we can use to avoid locking the module lock and deadlocking LLDB.
 
std::optional< uint32_t > m_cache_hash
 
- Protected Attributes inherited from lldb_private::ModuleChild
lldb::ModuleWP m_module_wp
 The Module that owns the object that inherits from this class.
 
- Static Protected Attributes inherited from lldb_private::ObjectFile
static size_t g_initial_bytes_to_read = 512
 The number of bytes to read when going through the plugins.
 

Detailed Description

Generic COFF object file reader.

Generic ELF object file reader.

This class provides a generic COFF reader plugin implementing the ObjectFile protocol. Assumes that the COFF object format is a Microsoft style COFF rather than the full generality afforded by it.

This class provides a generic ELF (32/64 bit) reader plugin implementing the ObjectFile protocol.

Definition at line 58 of file ObjectFileELF.h.

Member Typedef Documentation

◆ DynamicSymbolColl

Definition at line 190 of file ObjectFileELF.h.

◆ DynamicSymbolCollConstIter

typedef DynamicSymbolColl::const_iterator ObjectFileELF::DynamicSymbolCollConstIter
private

Definition at line 192 of file ObjectFileELF.h.

◆ DynamicSymbolCollIter

typedef DynamicSymbolColl::iterator ObjectFileELF::DynamicSymbolCollIter
private

Definition at line 191 of file ObjectFileELF.h.

◆ FileAddressToAddressClassMap

An ordered map of file address to address class.

Used on architectures like Arm where there is an alternative ISA mode like Thumb. The container is ordered so that it can be binary searched.

Definition at line 198 of file ObjectFileELF.h.

◆ ProgramHeaderColl

Definition at line 176 of file ObjectFileELF.h.

◆ SectionHeaderColl

Definition at line 182 of file ObjectFileELF.h.

◆ SectionHeaderCollConstIter

typedef SectionHeaderColl::const_iterator ObjectFileELF::SectionHeaderCollConstIter
private

Definition at line 184 of file ObjectFileELF.h.

◆ SectionHeaderCollIter

typedef SectionHeaderColl::iterator ObjectFileELF::SectionHeaderCollIter
private

Definition at line 183 of file ObjectFileELF.h.

Constructor & Destructor Documentation

◆ ObjectFileELF() [1/2]

ObjectFileELF::ObjectFileELF ( const lldb::ModuleSP module_sp,
lldb::DataBufferSP  data_sp,
lldb::offset_t  data_offset,
const lldb_private::FileSpec file,
lldb::offset_t  offset,
lldb::offset_t  length 
)
private

Definition at line 697 of file ObjectFileELF.cpp.

References lldb_private::ObjectFile::m_file.

◆ ObjectFileELF() [2/2]

ObjectFileELF::ObjectFileELF ( const lldb::ModuleSP module_sp,
lldb::DataBufferSP  header_data_sp,
const lldb::ProcessSP process_sp,
lldb::addr_t  header_addr 
)
private

Definition at line 706 of file ObjectFileELF.cpp.

Member Function Documentation

◆ AnySegmentHasPhysicalAddress()

bool ObjectFileELF::AnySegmentHasPhysicalAddress ( )
private

Definition at line 3809 of file ObjectFileELF.cpp.

References ProgramHeaders().

Referenced by GetLoadableData().

◆ ApplyRelocations()

unsigned ObjectFileELF::ApplyRelocations ( lldb_private::Symtab symtab,
const elf::ELFHeader hdr,
const elf::ELFSectionHeader rel_hdr,
const elf::ELFSectionHeader symtab_hdr,
const elf::ELFSectionHeader debug_hdr,
lldb_private::DataExtractor rel_data,
lldb_private::DataExtractor symtab_data,
lldb_private::DataExtractor debug_data,
lldb_private::Section rel_section 
)
private

◆ CalculateELFNotesSegmentsCRC32()

uint32_t ObjectFileELF::CalculateELFNotesSegmentsCRC32 ( const ProgramHeaderColl program_headers,
lldb_private::DataExtractor data 
)
staticprivate

Definition at line 471 of file ObjectFileELF.cpp.

References calc_crc32(), and lldb_private::DataExtractor::SetData().

Referenced by GetModuleSpecifications(), and GetUUID().

◆ CalculateStrata()

ObjectFile::Strata ObjectFileELF::CalculateStrata ( )
overridevirtual

The object file should be able to calculate the strata of the object file.

Many object files for platforms might be for either user space debugging or for kernel debugging. If your object file subclass can figure this out, it will help with debugger plug-in selection when it comes time to debug.

Returns
The calculated object file strata for the current object file.

Implements lldb_private::ObjectFile.

Definition at line 3671 of file ObjectFileELF.cpp.

References elf::ELFHeader::e_type, lldb_private::ObjectFile::eStrataKernel, lldb_private::ObjectFile::eStrataUnknown, lldb_private::ObjectFile::eStrataUser, lldb_private::SectionList::FindSectionByName(), lldb_private::ObjectFile::GetSectionList(), m_header, and ReadSectionData().

◆ CalculateType()

ObjectFile::Type ObjectFileELF::CalculateType ( )
overridevirtual

The object file should be able to calculate its type by looking at its file header and possibly the sections or other data in the object file.

The file type is used in the debugger to help select the correct plug- ins for the job at hand, so this is important to get right. If any eTypeXXX definitions do not match up with the type of file you are loading, please feel free to add a new enumeration value.

Returns
The calculated file type for the current object file.

Implements lldb_private::ObjectFile.

Definition at line 3643 of file ObjectFileELF.cpp.

References elf::ELFHeader::e_type, lldb_private::ObjectFile::eTypeCoreFile, lldb_private::ObjectFile::eTypeExecutable, lldb_private::ObjectFile::eTypeObjectFile, lldb_private::ObjectFile::eTypeSharedLibrary, lldb_private::ObjectFile::eTypeUnknown, and m_header.

Referenced by GetArchitecture(), ParseSymbols(), ParseSymtab(), and RelocateSection().

◆ classof()

static bool ObjectFileELF::classof ( const ObjectFile obj)
inlinestatic

Definition at line 98 of file ObjectFileELF.h.

References ID.

Referenced by IsDwpSymbolFile().

◆ CreateInstance()

ObjectFile * ObjectFileELF::CreateInstance ( const lldb::ModuleSP module_sp,
lldb::DataBufferSP  data_sp,
lldb::offset_t  data_offset,
const lldb_private::FileSpec file,
lldb::offset_t  file_offset,
lldb::offset_t  length 
)
static

◆ CreateMemoryInstance()

ObjectFile * ObjectFileELF::CreateMemoryInstance ( const lldb::ModuleSP module_sp,
lldb::WritableDataBufferSP  data_sp,
const lldb::ProcessSP process_sp,
lldb::addr_t  header_addr 
)
static

◆ CreateSections()

void ObjectFileELF::CreateSections ( lldb_private::SectionList unified_section_list)
overridevirtual

◆ Dump()

void ObjectFileELF::Dump ( lldb_private::Stream s)
overridevirtual

◆ DumpDependentModules()

void ObjectFileELF::DumpDependentModules ( lldb_private::Stream s)
private

◆ DumpELFDynamic()

void ObjectFileELF::DumpELFDynamic ( lldb_private::Stream s)
private

◆ DumpELFHeader()

void ObjectFileELF::DumpELFHeader ( lldb_private::Stream s,
const elf::ELFHeader header 
)
staticprivate

◆ DumpELFHeader_e_ident_EI_DATA()

void ObjectFileELF::DumpELFHeader_e_ident_EI_DATA ( lldb_private::Stream s,
unsigned char  ei_data 
)
staticprivate

Definition at line 3333 of file ObjectFileELF.cpp.

Referenced by DumpELFHeader().

◆ DumpELFHeader_e_type()

void ObjectFileELF::DumpELFHeader_e_type ( lldb_private::Stream s,
elf::elf_half  e_type 
)
staticprivate

Definition at line 3308 of file ObjectFileELF.cpp.

Referenced by DumpELFHeader().

◆ DumpELFProgramHeader()

void ObjectFileELF::DumpELFProgramHeader ( lldb_private::Stream s,
const elf::ELFProgramHeader ph 
)
staticprivate

◆ DumpELFProgramHeader_p_flags()

void ObjectFileELF::DumpELFProgramHeader_p_flags ( lldb_private::Stream s,
elf::elf_word  p_flags 
)
staticprivate

Definition at line 3390 of file ObjectFileELF.cpp.

Referenced by DumpELFProgramHeader().

◆ DumpELFProgramHeader_p_type()

void ObjectFileELF::DumpELFProgramHeader_p_type ( lldb_private::Stream s,
elf::elf_word  p_type 
)
staticprivate

Definition at line 3369 of file ObjectFileELF.cpp.

References CASE_AND_STREAM, and lldb_private::Stream::Printf().

Referenced by DumpELFProgramHeader().

◆ DumpELFProgramHeaders()

void ObjectFileELF::DumpELFProgramHeaders ( lldb_private::Stream s)
private

◆ DumpELFSectionHeader()

void ObjectFileELF::DumpELFSectionHeader ( lldb_private::Stream s,
const ELFSectionHeaderInfo sh 
)
staticprivate

◆ DumpELFSectionHeader_sh_flags()

void ObjectFileELF::DumpELFSectionHeader_sh_flags ( lldb_private::Stream s,
elf::elf_xword  sh_flags 
)
staticprivate

Definition at line 3465 of file ObjectFileELF.cpp.

Referenced by DumpELFSectionHeader().

◆ DumpELFSectionHeader_sh_type()

void ObjectFileELF::DumpELFSectionHeader_sh_type ( lldb_private::Stream s,
elf::elf_word  sh_type 
)
staticprivate

Definition at line 3437 of file ObjectFileELF.cpp.

References CASE_AND_STREAM, and lldb_private::Stream::Printf().

Referenced by DumpELFSectionHeader().

◆ DumpELFSectionHeaders()

void ObjectFileELF::DumpELFSectionHeaders ( lldb_private::Stream s)
private

◆ FindDynamicSymbol()

const ELFDynamic * ObjectFileELF::FindDynamicSymbol ( unsigned  tag)
private

◆ GetAddressByteSize()

uint32_t ObjectFileELF::GetAddressByteSize ( ) const
overridevirtual

Gets the address size in bytes for the current object file.

Returns
The size of an address in bytes for the currently selected architecture (and object for archives). Returns zero if no architecture or object has been selected.

Implements lldb_private::ObjectFile.

Definition at line 784 of file ObjectFileELF.cpp.

References lldb_private::DataExtractor::GetAddressByteSize(), and lldb_private::ObjectFile::m_data.

Referenced by GetImageInfoAddress(), GetNumSymbolsFromDynamicGnuHash(), GetSegmentData(), ReadDataFromDynamic(), ReadSectionData(), and SetLoadAddress().

◆ GetAddressClass()

AddressClass ObjectFileELF::GetAddressClass ( lldb::addr_t  file_addr)
overridevirtual

Get the address type given a file address in an object file.

Many binary file formats know what kinds This is primarily for ARM binaries, though it can be applied to any executable file format that supports different opcode types within the same binary. ARM binaries support having both ARM and Thumb within the same executable container. We need to be able to get

Returns
The size of an address in bytes for the currently selected architecture (and object for archives). Returns zero if no architecture or object has been selected.

Reimplemented from lldb_private::ObjectFile.

Definition at line 788 of file ObjectFileELF.cpp.

References lldb_private::ObjectFile::GetAddressClass(), lldb_private::Symtab::GetObjectFile(), lldb_private::ObjectFile::GetSymtab(), and m_address_class_map.

◆ GetArchitecture()

ArchSpec ObjectFileELF::GetArchitecture ( )
overridevirtual

Get the ArchSpec for this object file.

Returns
The ArchSpec of this object file. In case of error, an invalid ArchSpec object is returned.

Implements lldb_private::ObjectFile.

Definition at line 3617 of file ObjectFileELF.cpp.

References CalculateType(), lldb_private::ObjectFile::eTypeCoreFile, m_arch_spec, lldb_private::ObjectFile::m_data, m_section_headers, ParseHeader(), ParseSectionHeaders(), ProgramHeaders(), RefineModuleDetailsFromNote(), lldb_private::DataExtractor::SetData(), and lldb_private::ArchSpec::TripleOSWasSpecified().

Referenced by Dump(), ParseSymbols(), and ParseSymtab().

◆ GetBaseAddress()

Address ObjectFileELF::GetBaseAddress ( )
overridevirtual

Returns base address of this object file.

This also sometimes referred to as the "preferred load address" or the "image base address". Addresses within object files are often expressed relative to this base. If this address corresponds to a specific section (usually the first byte of the first section) then the returned address will have this section set. Otherwise, the address will just have the offset member filled in, indicating that this represents a file address.

Reimplemented from lldb_private::ObjectFile.

Definition at line 962 of file ObjectFileELF.cpp.

References lldb_private::ObjectFile::eTypeObjectFile, lldb_private::ObjectFile::GetSectionList(), lldb_private::ObjectFile::GetType(), LLDB_INVALID_ADDRESS, m_section_headers, elf::ELFProgramHeader::p_type, ProgramHeaders(), SectionIndex(), SegmentID(), and elf::ELFSectionHeader::sh_flags.

Referenced by GetSegmentData(), and SetLoadAddress().

◆ GetByteOrder()

ByteOrder ObjectFileELF::GetByteOrder ( ) const
overridevirtual

Gets whether endian swapping should occur when extracting data from this object file.

Returns
Returns true if endian swapping is needed, false otherwise.

Implements lldb_private::ObjectFile.

Definition at line 776 of file ObjectFileELF.cpp.

References elf::ELFHeader::e_ident, lldb::eByteOrderBig, lldb::eByteOrderInvalid, lldb::eByteOrderLittle, and m_header.

Referenced by GetSegmentData(), ReadDataFromDynamic(), and ReadSectionData().

◆ GetDebugLink()

std::optional< FileSpec > ObjectFileELF::GetDebugLink ( )

Return the contents of the .gnu_debuglink section, if the object file contains it.

Definition at line 867 of file ObjectFileELF.cpp.

References m_gnu_debuglink_file.

Referenced by SymbolVendorELF::CreateInstance().

◆ GetDependentModules()

uint32_t ObjectFileELF::GetDependentModules ( lldb_private::FileSpecList file_list)
overridevirtual

Extract the dependent modules from an object file.

If an object file has information about which other images it depends on (such as shared libraries), this function will provide the list. Since many executables or shared libraries may depend on the same files, FileSpecList::AppendIfUnique(const FileSpec &) should be used to make sure any files that are added are not already in the list.

Parameters
[out]file_listA list of file specification objects that gets dependent files appended to.
Returns
The number of new files that were appended to file_list.
See also
FileSpecList::AppendIfUnique(const FileSpec &)

Implements lldb_private::ObjectFile.

Definition at line 873 of file ObjectFileELF.cpp.

References lldb_private::FileSpecList::AppendIfUnique(), m_filespec_up, and ParseDependentModules().

◆ GetDynamicData()

std::optional< lldb_private::DataExtractor > ObjectFileELF::GetDynamicData ( )
private

Get the bytes that represent the .dynamic section.

This function will fetch the data for the .dynamic section in an ELF file. The PT_DYNAMIC program header will be used to extract the data and this function will fall back to using the section headers if PT_DYNAMIC isn't found.

Returns
The bytes that represent the string table data or std::nullopt if an error occured.

Definition at line 3911 of file ObjectFileELF.cpp.

References lldb::eSectionTypeELFDynamicLinkInfo, lldb_private::DataExtractor::GetByteSize(), lldb_private::ObjectFile::GetSectionList(), GetSegmentData(), m_dynamic_base_addr, ProgramHeaders(), and ReadSectionData().

Referenced by ParseDynamicSymbols().

◆ GetDynstrData()

std::optional< DataExtractor > ObjectFileELF::GetDynstrData ( )
private

Get the bytes that represent the dynamic string table data.

This function will fetch the data for the string table in an ELF file. If the ELF file is loaded from a file on disk, it will use the section headers to extract the data and fall back to using the DT_STRTAB and DT_STRSZ .dynamic entries.

Returns
The bytes that represent the string table data or std::nullopt if an error occured.

Definition at line 3873 of file ObjectFileELF.cpp.

References elf::ELFDynamic::d_val, lldb::eSectionTypeELFDynamicLinkInfo, FindDynamicSymbol(), GetSectionHeaderByIndex(), lldb_private::ObjectFile::GetSectionList(), ReadDataFromDynamic(), and ReadSectionData().

Referenced by ParseDynamicSymbols(), and ParseSymtab().

◆ GetDynsymDataFromDynamic()

std::optional< DataExtractor > ObjectFileELF::GetDynsymDataFromDynamic ( uint32_t &  num_symbols)
private

Get the bytes that represent the dynamic symbol table from the .dynamic section from process memory.

This functon uses the DT_SYMTAB value from the .dynamic section to read the symbols table data from process memory. The number of symbols in the symbol table is calculated by looking at the DT_HASH or DT_GNU_HASH values as the symbol count isn't stored in the .dynamic section.

Returns
The bytes that represent the symbol table data from the .dynamic section or section headers or std::nullopt if an error occured or if there is no dynamic symbol data available.

Definition at line 4027 of file ObjectFileELF.cpp.

References elf::ELFDynamic::d_val, FindDynamicSymbol(), GetNumSymbolsFromDynamicGnuHash(), GetNumSymbolsFromDynamicHash(), lldb_private::ObjectFile::m_process_wp, and ReadDataFromDynamic().

Referenced by ParseSymtab().

◆ GetEntryPointAddress()

lldb_private::Address ObjectFileELF::GetEntryPointAddress ( )
overridevirtual

Returns the address of the Entry Point in this object file - if the object file doesn't have an entry point (because it is not an executable file) then an invalid address is returned.

Returns
Returns the entry address for this module.

Reimplemented from lldb_private::ObjectFile.

Definition at line 945 of file ObjectFileELF.cpp.

References elf::ELFHeader::e_entry, lldb_private::ObjectFile::GetSectionList(), IsExecutable(), lldb_private::Address::IsValid(), m_entry_point_address, m_header, ParseHeader(), lldb_private::Address::ResolveAddressUsingFileSections(), and lldb_private::Address::SetOffset().

Referenced by ParseSymtab().

◆ GetGnuDebugDataObjectFile()

std::shared_ptr< ObjectFileELF > ObjectFileELF::GetGnuDebugDataObjectFile ( )
private

Takes the .gnu_debugdata and returns the decompressed object file that is stored within that section.

Returns
either the decompressed object file stored within the .gnu_debugdata section or nullptr if an error occured or if there's no section with that name.

Definition at line 2008 of file ObjectFileELF.cpp.

References lldb_private::FileSpec::CopyByAppendingPathComponent(), lldb_private::ObjectFile::eTypeDebugInfo, lldb_private::SectionList::FindSectionByName(), lldb_private::DataExtractor::GetData(), lldb_private::ObjectFile::GetFileSpec(), lldb_private::ModuleChild::GetModule(), lldb_private::ObjectFile::GetSectionList(), lldb_private::lzma::isAvailable(), m_gnu_debug_data_object_file, and lldb_private::lzma::uncompress().

Referenced by CreateSections().

◆ GetImageInfoAddress()

Address ObjectFileELF::GetImageInfoAddress ( lldb_private::Target target)
overridevirtual

Similar to Process::GetImageInfoAddress().

Some platforms embed auxiliary structures useful to debuggers in the address space of the inferior process. This method returns the address of such a structure if the information can be resolved via entries in the object file. ELF, for example, provides a means to hook into the runtime linker so that a debugger may monitor the loading and unloading of shared libraries.

Returns
The address of any auxiliary tables, or an invalid address if this object file format does not support or contain such information.

Reimplemented from lldb_private::ObjectFile.

Definition at line 885 of file ObjectFileELF.cpp.

References elf::ELFDynamic::d_tag, error(), GetAddressByteSize(), lldb_private::Address::GetLoadAddress(), lldb_private::ObjectFile::GetSectionList(), LLDB_INVALID_ADDRESS, m_dynamic_base_addr, m_dynamic_symbols, ParseDynamicSymbols(), lldb_private::Target::ReadPointerFromMemory(), lldb_private::Target::ReadUnsignedIntegerFromMemory(), lldb_private::Address::ResolveAddressUsingFileSections(), lldb_private::Address::SetOffset(), and UINT64_MAX.

Referenced by Dump().

◆ GetLoadableData()

std::vector< ObjectFile::LoadableData > ObjectFileELF::GetLoadableData ( lldb_private::Target target)
overrideprotectedvirtual

Loads this objfile to memory.

Loads the bits needed to create an executable image to the memory. It is useful with bare-metal targets where target does not have the ability to start a process itself.

Parameters
[in]targetTarget where to load.

Reimplemented from lldb_private::ObjectFile.

Definition at line 3818 of file ObjectFileELF.cpp.

References AnySegmentHasPhysicalAddress(), lldb_private::ObjectFile::LoadableData::Contents, lldb_private::ObjectFile::LoadableData::Dest, GetSegmentData(), LLDB_INVALID_ADDRESS, and ProgramHeaders().

◆ GetModuleSpecifications()

size_t ObjectFileELF::GetModuleSpecifications ( const lldb_private::FileSpec file,
lldb::DataBufferSP data_sp,
lldb::offset_t  data_offset,
lldb::offset_t  file_offset,
lldb::offset_t  length,
lldb_private::ModuleSpecList specs 
)
static

◆ GetNumSymbolsFromDynamicGnuHash()

std::optional< uint32_t > ObjectFileELF::GetNumSymbolsFromDynamicGnuHash ( )
private

Get the number of symbols from the DT_GNU_HASH dynamic entry.

Definition at line 3962 of file ObjectFileELF.cpp.

References FindDynamicSymbol(), GetAddressByteSize(), lldb_private::DataExtractor::GetU32(), and ReadDataFromDynamic().

Referenced by GetDynsymDataFromDynamic().

◆ GetNumSymbolsFromDynamicHash()

std::optional< uint32_t > ObjectFileELF::GetNumSymbolsFromDynamicHash ( )
private

Get the number of symbols from the DT_HASH dynamic entry.

Definition at line 3942 of file ObjectFileELF.cpp.

References FindDynamicSymbol(), lldb_private::DataExtractor::GetU32(), and ReadDataFromDynamic().

Referenced by GetDynsymDataFromDynamic().

◆ GetPluginDescriptionStatic()

static llvm::StringRef ObjectFileELF::GetPluginDescriptionStatic ( )
inlinestatic

Definition at line 67 of file ObjectFileELF.h.

Referenced by Initialize().

◆ GetPluginName()

llvm::StringRef ObjectFileELF::GetPluginName ( )
inlineoverridevirtual

Implements lldb_private::PluginInterface.

Definition at line 91 of file ObjectFileELF.h.

References GetPluginNameStatic().

◆ GetPluginNameStatic()

static llvm::StringRef ObjectFileELF::GetPluginNameStatic ( )
inlinestatic

Definition at line 65 of file ObjectFileELF.h.

Referenced by GetPluginName(), and Initialize().

◆ GetProgramHeaderInfo()

size_t ObjectFileELF::GetProgramHeaderInfo ( ProgramHeaderColl program_headers,
lldb_private::DataExtractor object_data,
const elf::ELFHeader header 
)
staticprivate

◆ GetSectionHeaderByIndex()

const ObjectFileELF::ELFSectionHeaderInfo * ObjectFileELF::GetSectionHeaderByIndex ( lldb::user_id_t  id)
private

Returns the section header with the given id or NULL.

Definition at line 1637 of file ObjectFileELF.cpp.

References m_section_headers, and ParseSectionHeaders().

Referenced by GetDynstrData(), ParseSymbolTable(), ParseSymtab(), ParseTrampolineSymbols(), and RelocateDebugSections().

◆ GetSectionHeaderInfo()

size_t ObjectFileELF::GetSectionHeaderInfo ( SectionHeaderColl section_headers,
lldb_private::DataExtractor object_data,
const elf::ELFHeader header,
lldb_private::UUID uuid,
std::string &  gnu_debuglink_file,
uint32_t &  gnu_debuglink_crc,
lldb_private::ArchSpec arch_spec 
)
staticprivate

Parses the elf section headers and returns the uuid, debug link name, crc, archspec.

Definition at line 1359 of file ObjectFileELF.cpp.

References elf::ELFHeader::e_flags, elf::ELFHeader::e_ident, elf::ELFHeader::e_machine, elf::ELFHeader::e_shentsize, elf::ELFHeader::e_shnum, elf::ELFHeader::e_shoff, elf::ELFHeader::e_shstrndx, lldb_private::eArchTypeELF, lldb_private::ArchSpec::eARM_abi_hard_float, lldb_private::ArchSpec::eARM_abi_soft_float, lldb_private::ArchSpec::eLoongArch_abi_double_float, lldb_private::ArchSpec::eLoongArch_abi_single_float, lldb_private::ArchSpec::eMIPS_ABI_FP_64, lldb_private::ArchSpec::eMIPS_ABI_FP_64A, lldb_private::ArchSpec::eMIPS_ABI_FP_ANY, lldb_private::ArchSpec::eMIPS_ABI_FP_DOUBLE, lldb_private::ArchSpec::eMIPS_ABI_FP_OLD_64, lldb_private::ArchSpec::eMIPS_ABI_FP_SINGLE, lldb_private::ArchSpec::eMIPS_ABI_FP_SOFT, lldb_private::ArchSpec::eMIPS_ABI_FP_XX, lldb_private::ArchSpec::eMIPSABI_EABI32, lldb_private::ArchSpec::eMIPSABI_EABI64, lldb_private::ArchSpec::eMIPSABI_N32, lldb_private::ArchSpec::eMIPSABI_N64, lldb_private::ArchSpec::eMIPSABI_O32, lldb_private::ArchSpec::eMIPSABI_O64, lldb_private::ArchSpec::eMIPSAse_mdmx, lldb_private::ArchSpec::eMIPSAse_micromips, lldb_private::ArchSpec::eMIPSAse_mips16, lldb_private::ArchSpec::eRISCV_float_abi_double, lldb_private::ArchSpec::eRISCV_float_abi_quad, lldb_private::ArchSpec::eRISCV_float_abi_single, lldb_private::ArchSpec::eRISCV_rvc, lldb_private::ArchSpec::eRISCV_rve, error(), lldb_private::DataExtractor::GetCStr(), lldb_private::ArchSpec::GetFlags(), lldb_private::GetLog(), lldb_private::ArchSpec::GetMachine(), GetOsFromOSABI(), lldb_private::ArchSpec::GetTriple(), lldb_private::DataExtractor::GetU32(), lldb_private::DataExtractor::GetU8(), lldb_private::ArchSpec::IsMIPS(), LLDB_LOGF, ParseARMAttributes(), lldb_private::DataExtractor::PeekCStr(), RefineModuleDetailsFromNote(), lldb_private::ArchSpec::SetArchitecture(), lldb_private::DataExtractor::SetData(), lldb_private::ArchSpec::SetFlags(), elf::ELFSectionHeader::sh_offset, elf::ELFSectionHeader::sh_size, elf::ELFSectionHeader::sh_type, subTypeFromElfHeader(), and UNUSED_IF_ASSERT_DISABLED.

Referenced by GetModuleSpecifications(), and ParseSectionHeaders().

◆ GetSectionHeaderStringTable()

size_t ObjectFileELF::GetSectionHeaderStringTable ( )
private

Loads the section name string table into m_shstr_data.

Returns the number of bytes constituting the table.

◆ GetSectionIndexByName()

lldb::user_id_t ObjectFileELF::GetSectionIndexByName ( const char *  name)
private

Utility method for looking up a section given its name.

Returns the index of the corresponding section or zero if no section with the given name can be found (note that section indices are always 1 based, and so section index 0 is never valid).

Definition at line 1647 of file ObjectFileELF.cpp.

References m_section_headers, and ParseSectionHeaders().

Referenced by ParseTrampolineSymbols().

◆ GetSectionType()

SectionType ObjectFileELF::GetSectionType ( const ELFSectionHeaderInfo H) const
private

◆ GetSegmentData()

DataExtractor ObjectFileELF::GetSegmentData ( const elf::ELFProgramHeader H)

◆ GetUUID()

UUID ObjectFileELF::GetUUID ( )
overridevirtual

Gets the UUID for this object file.

If the object file format contains a UUID, the value should be returned. Else ObjectFile instances should return the MD5 checksum of all of the bytes for the object file (or memory for memory based object files).

Returns
The object file's UUID. In case of an error, an empty UUID is returned.

Implements lldb_private::ObjectFile.

Definition at line 829 of file ObjectFileELF.cpp.

References calc_crc32(), CalculateELFNotesSegmentsCRC32(), lldb_private::ObjectFile::eTypeCoreFile, g_core_uuid_magic, lldb_private::ObjectFile::GetType(), lldb_private::ObjectFile::m_data, m_gnu_debuglink_crc, m_program_headers, m_uuid, ParseProgramHeaders(), and ParseSectionHeaders().

Referenced by SymbolVendorELF::CreateInstance().

◆ Initialize()

void ObjectFileELF::Initialize ( )
static

◆ isA()

bool ObjectFileELF::isA ( const void *  ClassID) const
inlineoverridevirtual

Reimplemented from lldb_private::ObjectFile.

Definition at line 95 of file ObjectFileELF.h.

References ID.

◆ IsExecutable()

bool ObjectFileELF::IsExecutable ( ) const
overridevirtual

Tells whether this object file is capable of being the main executable for a process.

Returns
true if it is, false otherwise.

Implements lldb_private::ObjectFile.

Definition at line 712 of file ObjectFileELF.cpp.

References elf::ELFHeader::e_entry, elf::ELFHeader::e_type, and m_header.

Referenced by GetEntryPointAddress().

◆ IsStripped()

bool ObjectFileELF::IsStripped ( )
overridevirtual

Detect if this object file has been stripped of local symbols.

Detect if this object file has been stripped of local symbols.

Returns
Return true if the object file has been stripped of local symbols.

Implements lldb_private::ObjectFile.

Definition at line 3217 of file ObjectFileELF.cpp.

◆ MagicBytesMatch()

bool ObjectFileELF::MagicBytesMatch ( lldb::DataBufferSP data_sp,
lldb::addr_t  offset,
lldb::addr_t  length 
)
static

Definition at line 455 of file ObjectFileELF.cpp.

References elf::ELFHeader::MagicBytesMatch().

Referenced by GetModuleSpecifications().

◆ MapFileDataWritable()

lldb::WritableDataBufferSP ObjectFileELF::MapFileDataWritable ( const lldb_private::FileSpec file,
uint64_t  Size,
uint64_t  Offset 
)
staticprotected

◆ ParseARMAttributes()

void ObjectFileELF::ParseARMAttributes ( lldb_private::DataExtractor data,
uint64_t  length,
lldb_private::ArchSpec arch_spec 
)
staticprivate

◆ ParseDependentModules()

size_t ObjectFileELF::ParseDependentModules ( )
private

Scans the dynamic section and locates all dependent modules (shared libraries) populating m_filespec_up.

This method will compute the dependent module list only once. Returns the number of dependent modules parsed.

Definition at line 984 of file ObjectFileELF.cpp.

References lldb_private::FileSystem::Instance(), m_dynamic_symbols, m_filespec_up, ParseDynamicSymbols(), and lldb_private::FileSystem::Resolve().

Referenced by DumpDependentModules(), and GetDependentModules().

◆ ParseDynamicSymbols()

size_t ObjectFileELF::ParseDynamicSymbols ( )
private

Parses the dynamic symbol table and populates m_dynamic_symbols.

The vector retains the order as found in the object file. Returns the number of dynamic symbols parsed.

Definition at line 2467 of file ObjectFileELF.cpp.

References elf::ELFDynamic::d_tag, GetDynamicData(), GetDynstrData(), m_dynamic_symbols, elf::ELFDynamic::Parse(), and ObjectFileELF::ELFDynamicWithName::symbol.

Referenced by DumpELFDynamic(), FindDynamicSymbol(), GetImageInfoAddress(), and ParseDependentModules().

◆ ParseHeader()

bool ObjectFileELF::ParseHeader ( )
overridevirtual

Attempts to parse the object header.

This function is used as a test to see if a given plug-in instance can parse the header data already contained in ObjectFile::m_data. If an object file parser does not recognize that magic bytes in a header, false should be returned and the next plug-in can attempt to parse an object file.

Returns
Returns true if the header was parsed successfully, false otherwise.

Implements lldb_private::ObjectFile.

Definition at line 824 of file ObjectFileELF.cpp.

References lldb_private::ObjectFile::m_data, m_header, and elf::ELFHeader::Parse().

Referenced by GetArchitecture(), and GetEntryPointAddress().

◆ ParseProgramHeaders()

bool ObjectFileELF::ParseProgramHeaders ( )
private

Parses all section headers present in this object file and populates m_program_headers.

This method will compute the header list only once. Returns true iff the headers have been successfully parsed.

Definition at line 1040 of file ObjectFileELF.cpp.

References GetProgramHeaderInfo(), lldb_private::ObjectFile::m_data, m_header, and m_program_headers.

Referenced by DumpELFProgramHeaders(), GetUUID(), and ProgramHeaders().

◆ ParseSectionHeaders()

size_t ObjectFileELF::ParseSectionHeaders ( )
private

Parses all section headers present in this object file and populates m_section_headers.

This method will compute the header list only once. Returns the number of headers parsed.

Definition at line 1630 of file ObjectFileELF.cpp.

References GetSectionHeaderInfo(), m_arch_spec, lldb_private::ObjectFile::m_data, m_gnu_debuglink_crc, m_gnu_debuglink_file, m_header, m_section_headers, and m_uuid.

Referenced by CreateSections(), DumpELFSectionHeaders(), GetArchitecture(), GetSectionHeaderByIndex(), GetSectionIndexByName(), and GetUUID().

◆ ParseSymbols()

std::pair< unsigned, ObjectFileELF::FileAddressToAddressClassMap > ObjectFileELF::ParseSymbols ( lldb_private::Symtab symbol_table,
lldb::user_id_t  start_id,
lldb_private::SectionList section_list,
const size_t  num_symbols,
const lldb_private::DataExtractor symtab_data,
const lldb_private::DataExtractor strtab_data 
)
private

◆ ParseSymbolTable()

std::pair< unsigned, ObjectFileELF::FileAddressToAddressClassMap > ObjectFileELF::ParseSymbolTable ( lldb_private::Symtab symbol_table,
lldb::user_id_t  start_id,
lldb_private::Section symtab 
)
private

Populates the symbol table with all non-dynamic linker symbols.

This method will parse the symbols only once. Returns the number of symbols parsed and a map of address types (used by targets like Arm that have an alternative ISA mode like Thumb).

Definition at line 2418 of file ObjectFileELF.cpp.

References lldb_private::SectionList::FindSectionByID(), lldb_private::DataExtractor::GetByteSize(), lldb_private::UserID::GetID(), lldb_private::Section::GetObjectFile(), GetSectionHeaderByIndex(), m_address_class_map, lldb_private::ObjectFile::m_sections_up, ParseSymbols(), ParseSymbolTable(), ReadSectionData(), elf::ELFSectionHeader::sh_entsize, elf::ELFSectionHeader::sh_link, and elf::ELFSectionHeader::sh_type.

Referenced by ParseSymbolTable(), and ParseSymtab().

◆ ParseSymtab()

void ObjectFileELF::ParseSymtab ( lldb_private::Symtab symtab)
overridevirtual

Parse the symbol table into the provides symbol table object.

Symbol table parsing will be done once when this function is called by each object file plugin. All of the necessary locks will already be acquired before this function is called and the symbol table object to populate is supplied as an argument and doesn't need to be created by each plug-in.

Parameters
Thesymbol table to populate.

Implements lldb_private::ObjectFile.

Definition at line 2972 of file ObjectFileELF.cpp.

References lldb_private::Symtab::AddSymbol(), lldb_private::ConstString::AsCString(), CalculateType(), elf::ELFDynamic::d_ptr, elapsed(), lldb::eSectionTypeELFDynamicSymbols, lldb::eSectionTypeELFSymbolTable, lldb::eSymbolTypeCode, lldb_private::ObjectFile::eTypeExecutable, FindDynamicSymbol(), lldb_private::SectionList::FindSectionByType(), lldb_private::SectionList::FindSectionContainingFileAddress(), lldb_private::Symtab::FindSymbolContainingFileAddress(), lldb_private::Symbol::GetAddressRef(), GetArchitecture(), GetDynstrData(), GetDynsymDataFromDynamic(), GetEntryPointAddress(), lldb_private::FileSpec::GetFilename(), lldb_private::UserID::GetID(), lldb_private::ArchSpec::GetMachine(), lldb_private::ModuleChild::GetModule(), lldb_private::Symtab::GetNumSymbols(), GetSectionHeaderByIndex(), lldb_private::ObjectFile::GetSectionList(), m_address_class_map, lldb_private::ObjectFile::m_file, ParseSymbols(), ParseSymbolTable(), lldb_private::ObjectFile::ParseSymtab(), ParseTrampolineSymbols(), ParseUnwindSymbols(), and lldb_private::Address::SetOffset().

◆ ParseTrampolineSymbols()

unsigned ObjectFileELF::ParseTrampolineSymbols ( lldb_private::Symtab symbol_table,
lldb::user_id_t  start_id,
const ELFSectionHeaderInfo rela_hdr,
lldb::user_id_t  section_id 
)
private

Scans the relocation entries and adds a set of artificial symbols to the given symbol table for each PLT slot.

Returns the number of symbols added.

Definition at line 2632 of file ObjectFileELF.cpp.

References lldb_private::SectionList::FindSectionByID(), GetSectionHeaderByIndex(), GetSectionIndexByName(), m_header, lldb_private::ObjectFile::m_sections_up, ParsePLTRelocations(), PLTRelocationType(), ReadSectionData(), elf::ELFSectionHeader::sh_link, and elf::ELFSectionHeader::sh_type.

Referenced by ParseSymtab().

◆ ParseUnwindSymbols()

void ObjectFileELF::ParseUnwindSymbols ( lldb_private::Symtab symbol_table,
lldb_private::DWARFCallFrameInfo eh_frame 
)
private

◆ PLTRelocationType()

unsigned ObjectFileELF::PLTRelocationType ( )
private

Definition at line 2515 of file ObjectFileELF.cpp.

References elf::ELFDynamic::d_val, and FindDynamicSymbol().

Referenced by ParseTrampolineSymbols().

◆ ProgramHeaders()

llvm::ArrayRef< ELFProgramHeader > ObjectFileELF::ProgramHeaders ( )

◆ ReadDataFromDynamic()

std::optional< DataExtractor > ObjectFileELF::ReadDataFromDynamic ( const elf::ELFDynamic dyn,
uint64_t  length,
uint64_t  offset = 0 
)
private

Read the bytes pointed to by the dyn dynamic entry.

ELFDynamic::d_ptr values contain file addresses if we load the ELF file form a file on disk, or they contain load addresses if they were read from memory. This function will correctly extract the data in both cases if it is available.

Parameters
[in]dynThe dynamic entry to use to fetch the data from.
[in]lengthThe number of bytes to read.
[in]offsetThe number of bytes to skip after the d_ptr value before reading data.
Returns
The bytes that represent the dynanic entries data or std::nullopt if an error occured or the data is not available.

Definition at line 3848 of file ObjectFileELF.cpp.

References elf::ELFDynamic::d_ptr, GetAddressByteSize(), GetByteOrder(), lldb_private::Address::GetSection(), lldb_private::ObjectFile::GetSectionList(), lldb_private::ObjectFile::m_process_wp, lldb_private::ObjectFile::ReadMemory(), and lldb_private::Address::ResolveAddressUsingFileSections().

Referenced by GetDynstrData(), GetDynsymDataFromDynamic(), GetNumSymbolsFromDynamicGnuHash(), and GetNumSymbolsFromDynamicHash().

◆ ReadSectionData() [1/2]

size_t ObjectFileELF::ReadSectionData ( lldb_private::Section section,
lldb::offset_t  section_offset,
void *  dst,
size_t  dst_len 
)
overridevirtual

◆ ReadSectionData() [2/2]

size_t ObjectFileELF::ReadSectionData ( lldb_private::Section section,
lldb_private::DataExtractor section_data 
)
overridevirtual

◆ RefineModuleDetailsFromNote()

lldb_private::Status ObjectFileELF::RefineModuleDetailsFromNote ( lldb_private::DataExtractor data,
lldb_private::ArchSpec arch_spec,
lldb_private::UUID uuid 
)
staticprivate

◆ RelocateDebugSections()

unsigned ObjectFileELF::RelocateDebugSections ( const elf::ELFSectionHeader rel_hdr,
lldb::user_id_t  rel_id,
lldb_private::Symtab thetab 
)
private

◆ RelocateSection()

void ObjectFileELF::RelocateSection ( lldb_private::Section section)
overridevirtual

◆ SectionIndex() [1/2]

size_t ObjectFileELF::SectionIndex ( const SectionHeaderCollConstIter I) const
private

Returns the index of the given section header.

Definition at line 820 of file ObjectFileELF.cpp.

References m_section_headers.

◆ SectionIndex() [2/2]

size_t ObjectFileELF::SectionIndex ( const SectionHeaderCollIter I)
private

Returns the index of the given section header.

Definition at line 816 of file ObjectFileELF.cpp.

References m_section_headers.

Referenced by CreateSections(), GetBaseAddress(), and RelocateSection().

◆ SetLoadAddress()

bool ObjectFileELF::SetLoadAddress ( lldb_private::Target target,
lldb::addr_t  value,
bool  value_is_offset 
)
overridevirtual

◆ StripLinkerSymbolAnnotations()

llvm::StringRef ObjectFileELF::StripLinkerSymbolAnnotations ( llvm::StringRef  symbol_name) const
overridevirtual

Reimplemented from lldb_private::ObjectFile.

Definition at line 1624 of file ObjectFileELF.cpp.

◆ Terminate()

void ObjectFileELF::Terminate ( )
static

Member Data Documentation

◆ g_core_uuid_magic

const uint32_t ObjectFileELF::g_core_uuid_magic
staticprivate

Definition at line 202 of file ObjectFileELF.h.

Referenced by GetModuleSpecifications(), and GetUUID().

◆ ID

char ObjectFileELF::ID
static

Definition at line 94 of file ObjectFileELF.h.

Referenced by classof(), and isA().

◆ m_address_class_map

FileAddressToAddressClassMap ObjectFileELF::m_address_class_map
private

The address class for each symbol in the elf file.

Definition at line 242 of file ObjectFileELF.h.

Referenced by GetAddressClass(), ParseSymbols(), ParseSymbolTable(), and ParseSymtab().

◆ m_arch_spec

lldb_private::ArchSpec ObjectFileELF::m_arch_spec
private

The architecture detected from parsing elf file contents.

Definition at line 239 of file ObjectFileELF.h.

Referenced by CreateSections(), GetArchitecture(), and ParseSectionHeaders().

◆ m_dynamic_base_addr

lldb::addr_t ObjectFileELF::m_dynamic_base_addr = LLDB_INVALID_ADDRESS
private

The file address of the .dynamic section.

This can be found in the p_vaddr of the PT_DYNAMIC program header.

Definition at line 222 of file ObjectFileELF.h.

Referenced by GetDynamicData(), and GetImageInfoAddress().

◆ m_dynamic_symbols

DynamicSymbolColl ObjectFileELF::m_dynamic_symbols
private

Collection of symbols from the dynamic table.

Definition at line 225 of file ObjectFileELF.h.

Referenced by DumpELFDynamic(), FindDynamicSymbol(), GetImageInfoAddress(), ParseDependentModules(), and ParseDynamicSymbols().

◆ m_entry_point_address

lldb_private::Address ObjectFileELF::m_entry_point_address
private

Cached value of the entry point for this module.

Definition at line 236 of file ObjectFileELF.h.

Referenced by GetEntryPointAddress().

◆ m_filespec_up

std::unique_ptr<lldb_private::FileSpecList> ObjectFileELF::m_filespec_up
mutableprivate

List of file specifications corresponding to the modules (shared libraries) on which this object file depends.

Definition at line 233 of file ObjectFileELF.h.

Referenced by DumpDependentModules(), GetDependentModules(), and ParseDependentModules().

◆ m_gnu_debug_data_object_file

std::shared_ptr<ObjectFileELF> ObjectFileELF::m_gnu_debug_data_object_file
private

Object file parsed from .gnu_debugdata section (.

See also
GetGnuDebugDataObjectFile())

Definition at line 229 of file ObjectFileELF.h.

Referenced by GetGnuDebugDataObjectFile().

◆ m_gnu_debuglink_crc

uint32_t ObjectFileELF::m_gnu_debuglink_crc = 0
private

Definition at line 212 of file ObjectFileELF.h.

Referenced by GetUUID(), and ParseSectionHeaders().

◆ m_gnu_debuglink_file

std::string ObjectFileELF::m_gnu_debuglink_file
private

ELF .gnu_debuglink file and crc data if available.

Definition at line 211 of file ObjectFileELF.h.

Referenced by GetDebugLink(), and ParseSectionHeaders().

◆ m_header

elf::ELFHeader ObjectFileELF::m_header
private

◆ m_plugin_version

const uint32_t ObjectFileELF::m_plugin_version = 1
staticprivate

Version of this reader common to all plugins based on this class.

Definition at line 201 of file ObjectFileELF.h.

◆ m_program_headers

ProgramHeaderColl ObjectFileELF::m_program_headers
private

Collection of program headers.

Definition at line 215 of file ObjectFileELF.h.

Referenced by DumpELFProgramHeaders(), GetUUID(), ParseProgramHeaders(), and ProgramHeaders().

◆ m_section_headers

SectionHeaderColl ObjectFileELF::m_section_headers
private

◆ m_uuid

lldb_private::UUID ObjectFileELF::m_uuid
private

ELF build ID.

Definition at line 208 of file ObjectFileELF.h.

Referenced by GetUUID(), and ParseSectionHeaders().


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