diff options
Diffstat (limited to 'include/lldb/Symbol/ObjectFile.h')
-rw-r--r-- | include/lldb/Symbol/ObjectFile.h | 1632 |
1 files changed, 768 insertions, 864 deletions
diff --git a/include/lldb/Symbol/ObjectFile.h b/include/lldb/Symbol/ObjectFile.h index 53f0f3c80517..e2e4500ace46 100644 --- a/include/lldb/Symbol/ObjectFile.h +++ b/include/lldb/Symbol/ObjectFile.h @@ -10,46 +10,35 @@ #ifndef liblldb_ObjectFile_h_ #define liblldb_ObjectFile_h_ -#include "lldb/lldb-private.h" #include "lldb/Core/DataExtractor.h" -#include "lldb/Host/FileSpec.h" #include "lldb/Core/FileSpecList.h" #include "lldb/Core/ModuleChild.h" #include "lldb/Core/PluginInterface.h" #include "lldb/Host/Endian.h" +#include "lldb/Host/FileSpec.h" #include "lldb/Symbol/Symtab.h" #include "lldb/Symbol/UnwindTable.h" +#include "lldb/lldb-private.h" namespace lldb_private { - -class ObjectFileJITDelegate -{ + +class ObjectFileJITDelegate { public: - ObjectFileJITDelegate () - { - } - - virtual - ~ObjectFileJITDelegate() - { - } - - virtual lldb::ByteOrder - GetByteOrder () const = 0; - - virtual uint32_t - GetAddressByteSize () const = 0; - - virtual void - PopulateSymtab (lldb_private::ObjectFile *obj_file, - lldb_private::Symtab &symtab) = 0; - - virtual void - PopulateSectionList (lldb_private::ObjectFile *obj_file, - lldb_private::SectionList §ion_list) = 0; - - virtual bool - GetArchitecture (lldb_private::ArchSpec &arch) = 0; + ObjectFileJITDelegate() {} + + virtual ~ObjectFileJITDelegate() {} + + virtual lldb::ByteOrder GetByteOrder() const = 0; + + virtual uint32_t GetAddressByteSize() const = 0; + + virtual void PopulateSymtab(lldb_private::ObjectFile *obj_file, + lldb_private::Symtab &symtab) = 0; + + virtual void PopulateSectionList(lldb_private::ObjectFile *obj_file, + lldb_private::SectionList §ion_list) = 0; + + virtual bool GetArchitecture(lldb_private::ArchSpec &arch) = 0; }; //---------------------------------------------------------------------- @@ -68,849 +57,764 @@ public: /// Once an architecture is selected the object file information can be /// extracted from this abstract class. //---------------------------------------------------------------------- -class ObjectFile: - public std::enable_shared_from_this<ObjectFile>, - public PluginInterface, - public ModuleChild -{ -friend class lldb_private::Module; +class ObjectFile : public std::enable_shared_from_this<ObjectFile>, + public PluginInterface, + public ModuleChild { + friend class lldb_private::Module; public: - typedef enum - { - eTypeInvalid = 0, - eTypeCoreFile, /// A core file that has a checkpoint of a program's execution state - eTypeExecutable, /// A normal executable - eTypeDebugInfo, /// An object file that contains only debug information - eTypeDynamicLinker, /// The platform's dynamic linker executable - eTypeObjectFile, /// An intermediate object file - eTypeSharedLibrary, /// A shared library that can be used during execution - eTypeStubLibrary, /// A library that can be linked against but not used for execution - eTypeJIT, /// JIT code that has symbols, sections and possibly debug info - eTypeUnknown - } Type; - - typedef enum - { - eStrataInvalid = 0, - eStrataUnknown, - eStrataUser, - eStrataKernel, - eStrataRawImage, - eStrataJIT - } Strata; - - //------------------------------------------------------------------ - /// Construct with a parent module, offset, and header data. - /// - /// Object files belong to modules and a valid module must be - /// supplied upon construction. The at an offset within a file for - /// objects that contain more than one architecture or object. - //------------------------------------------------------------------ - ObjectFile (const lldb::ModuleSP &module_sp, - const FileSpec *file_spec_ptr, - lldb::offset_t file_offset, - lldb::offset_t length, - const lldb::DataBufferSP& data_sp, - lldb::offset_t data_offset); - - ObjectFile (const lldb::ModuleSP &module_sp, - const lldb::ProcessSP &process_sp, - lldb::addr_t header_addr, - lldb::DataBufferSP& data_sp); - - //------------------------------------------------------------------ - /// Destructor. - /// - /// The destructor is virtual since this class is designed to be - /// inherited from by the plug-in instance. - //------------------------------------------------------------------ - ~ObjectFile() override; - - //------------------------------------------------------------------ - /// Dump a description of this object to a Stream. - /// - /// Dump a description of the current contents of this object - /// to the supplied stream \a s. The dumping should include the - /// section list if it has been parsed, and the symbol table - /// if it has been parsed. - /// - /// @param[in] s - /// The stream to which to dump the object description. - //------------------------------------------------------------------ - virtual void - Dump (Stream *s) = 0; - - //------------------------------------------------------------------ - /// Find a ObjectFile plug-in that can parse \a file_spec. - /// - /// Scans all loaded plug-in interfaces that implement versions of - /// the ObjectFile plug-in interface and returns the first - /// instance that can parse the file. - /// - /// @param[in] module - /// The parent module that owns this object file. - /// - /// @param[in] file_spec - /// A file specification that indicates which file to use as the - /// object file. - /// - /// @param[in] file_offset - /// The offset into the file at which to start parsing the - /// object. This is for files that contain multiple - /// architectures or objects. - /// - /// @param[in] file_size - /// The size of the current object file if it can be determined - /// or if it is known. This can be zero. - /// - /// @see ObjectFile::ParseHeader() - //------------------------------------------------------------------ - 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 a file in memory. - /// - /// Scans all loaded plug-in interfaces that implement versions of - /// the ObjectFile plug-in interface and returns the first - /// instance that can parse the file. - /// - /// @param[in] module - /// The parent module that owns this object file. - /// - /// @param[in] process_sp - /// A shared pointer to the process whose memory space contains - /// an object file. This will be stored as a std::weak_ptr. - /// - /// @param[in] header_addr - /// The address of the header for the object file in memory. - //------------------------------------------------------------------ - static lldb::ObjectFileSP - FindPlugin (const lldb::ModuleSP &module_sp, - const lldb::ProcessSP &process_sp, - lldb::addr_t header_addr, - lldb::DataBufferSP &file_data_sp); - - - static size_t - GetModuleSpecifications (const FileSpec &file, - lldb::offset_t file_offset, - lldb::offset_t file_size, - ModuleSpecList &specs); - - 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); - //------------------------------------------------------------------ - /// Split a path into a file path with object name. - /// - /// For paths like "/tmp/foo.a(bar.o)" we often need to split a path - /// up into the actual path name and into the object name so we can - /// make a valid object file from it. - /// - /// @param[in] path_with_object - /// A path that might contain an archive path with a .o file - /// specified in parens in the basename of the path. - /// - /// @param[out] archive_file - /// If \b true is returned, \a file_spec will be filled in with - /// the path to the archive. - /// - /// @param[out] archive_object - /// If \b true is returned, \a object will be filled in with - /// the name of the object inside the archive. - /// - /// @return - /// \b true if the path matches the pattern of archive + object - /// and \a archive_file and \a archive_object are modified, - /// \b false otherwise and \a archive_file and \a archive_object - /// are guaranteed to be remain unchanged. - //------------------------------------------------------------------ - static bool - SplitArchivePathWithObject (const char *path_with_object, - lldb_private::FileSpec &archive_file, - lldb_private::ConstString &archive_object, - bool must_exist); - - //------------------------------------------------------------------ - /// Gets the address size in bytes for the current object file. - /// - /// @return - /// 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. - //------------------------------------------------------------------ - virtual uint32_t - GetAddressByteSize () const = 0; - - //------------------------------------------------------------------ - /// 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 - /// @return - /// 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. - //------------------------------------------------------------------ - virtual lldb::AddressClass - GetAddressClass (lldb::addr_t file_addr); - - //------------------------------------------------------------------ - /// 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. - /// - /// @param[out] file_list - /// A list of file specification objects that gets dependent - /// files appended to. - /// - /// @return - /// The number of new files that were appended to \a file_list. - /// - /// @see FileSpecList::AppendIfUnique(const FileSpec &) - //------------------------------------------------------------------ - virtual uint32_t - GetDependentModules (FileSpecList& file_list) = 0; - - //------------------------------------------------------------------ - /// Tells whether this object file is capable of being the main executable - /// for a process. - /// - /// @return - /// \b true if it is, \b false otherwise. - //------------------------------------------------------------------ - virtual bool - IsExecutable () const = 0; - - //------------------------------------------------------------------ - /// Returns the offset into a file at which this object resides. - /// - /// Some files contain many object files, and this function allows - /// access to an object's offset within the file. - /// - /// @return - /// The offset in bytes into the file. Defaults to zero for - /// simple object files that a represented by an entire file. - //------------------------------------------------------------------ - virtual lldb::addr_t - GetFileOffset () const - { return m_file_offset; } - - virtual lldb::addr_t - GetByteSize () const - { return m_length; } - - //------------------------------------------------------------------ - /// Get accessor to the object file specification. - /// - /// @return - /// The file specification object pointer if there is one, or - /// NULL if this object is only from memory. - //------------------------------------------------------------------ - virtual FileSpec& - GetFileSpec() { return m_file; } - - //------------------------------------------------------------------ - /// Get const accessor to the object file specification. - /// - /// @return - /// The const file specification object pointer if there is one, - /// or NULL if this object is only from memory. - //------------------------------------------------------------------ - virtual const FileSpec& - GetFileSpec() const { return m_file; } - - //------------------------------------------------------------------ - /// Get the name of the cpu, vendor and OS for this object file. - /// - /// This value is a string that represents the target triple where - /// the cpu type, the vendor and the OS are encoded into a string. - /// - /// @param[out] target_triple - /// The string value of the target triple. - /// - /// @return - /// \b True if the target triple was able to be computed, \b - /// false otherwise. - //------------------------------------------------------------------ - virtual bool - GetArchitecture (ArchSpec &arch) = 0; - - //------------------------------------------------------------------ - /// Gets the section list for the currently selected architecture - /// (and object for archives). - /// - /// Section list parsing can be deferred by ObjectFile instances - /// until this accessor is called the first time. - /// - /// @return - /// The list of sections contained in this object file. - //------------------------------------------------------------------ - virtual SectionList * - GetSectionList (bool update_module_section_list = true); - - virtual void - CreateSections (SectionList &unified_section_list) = 0; - - //------------------------------------------------------------------ - /// Notify the ObjectFile that the file addresses in the Sections - /// for this module have been changed. - //------------------------------------------------------------------ - virtual void - SectionFileAddressesChanged () - { - } - - //------------------------------------------------------------------ - /// Gets the symbol table for the currently selected architecture - /// (and object for archives). - /// - /// Symbol table parsing can be deferred by ObjectFile instances - /// until this accessor is called the first time. - /// - /// @return - /// The symbol table for this object file. - //------------------------------------------------------------------ - virtual Symtab * - GetSymtab () = 0; - - //------------------------------------------------------------------ - /// Appends a Symbol for the specified so_addr to the symbol table. - /// - /// If verify_unique is false, the symbol table is not searched - /// to determine if a Symbol found at this address has already been - /// added to the symbol table. When verify_unique is true, this - /// method resolves the Symbol as the first match in the SymbolTable - /// and appends a Symbol only if required/found. - /// - /// @return - /// The resolved symbol or nullptr. Returns nullptr if a - /// a Symbol could not be found for the specified so_addr. - //------------------------------------------------------------------ - virtual Symbol * - ResolveSymbolForAddress(const Address &so_addr, bool verify_unique) - { - // Typically overridden to lazily add stripped symbols recoverable from - // the exception handling unwind information (i.e. without parsing - // the entire eh_frame section. - // - // The availability of LC_FUNCTION_STARTS allows ObjectFileMachO - // to efficiently add stripped symbols when the symbol table is - // first constructed. Poorer cousins are PECoff and ELF. - return nullptr; - } - - //------------------------------------------------------------------ - /// Detect if this object file has been stripped of local symbols. - //------------------------------------------------------------------ - /// Detect if this object file has been stripped of local symbols. - /// - /// @return - /// Return \b true if the object file has been stripped of local - /// symbols. - //------------------------------------------------------------------ - virtual bool - IsStripped () = 0; - - //------------------------------------------------------------------ - /// Frees the symbol table. - /// - /// This function should only be used when an object file is - /// - /// @param[in] flags - /// eSymtabFromUnifiedSectionList: Whether to clear symbol table - /// for unified module section list, or object file. - /// - /// @return - /// The symbol table for this object file. - //------------------------------------------------------------------ - virtual void - ClearSymtab (); - - //------------------------------------------------------------------ - /// 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). - /// - /// @return - /// Returns \b true if a UUID was successfully extracted into - /// \a uuid, \b false otherwise. - //------------------------------------------------------------------ - virtual bool - GetUUID (lldb_private::UUID* uuid) = 0; - - //------------------------------------------------------------------ - /// Gets the symbol file spec list for this object file. - /// - /// If the object file format contains a debug symbol file link, - /// the values will be returned in the FileSpecList. - /// - /// @return - /// Returns filespeclist. - //------------------------------------------------------------------ - virtual lldb_private::FileSpecList - GetDebugSymbolFilePaths() - { - return FileSpecList(); - } - - //------------------------------------------------------------------ - /// Gets the file spec list of libraries re-exported by this object file. - /// - /// If the object file format has the notion of one library re-exporting the symbols from another, - /// the re-exported libraries will be returned in the FileSpecList. - /// - /// @return - /// Returns filespeclist. - //------------------------------------------------------------------ - virtual lldb_private::FileSpecList - GetReExportedLibraries () - { - return FileSpecList(); - } - - //------------------------------------------------------------------ - /// Sets the load address for an entire module, assuming a rigid - /// slide of sections, if possible in the implementation. - /// - /// @return - /// Returns true iff any section's load address changed. - //------------------------------------------------------------------ - virtual bool - SetLoadAddress(Target &target, - lldb::addr_t value, - bool value_is_offset) - { - return false; + typedef enum { + eTypeInvalid = 0, + eTypeCoreFile, /// A core file that has a checkpoint of a program's + /// execution state + eTypeExecutable, /// A normal executable + eTypeDebugInfo, /// An object file that contains only debug information + eTypeDynamicLinker, /// The platform's dynamic linker executable + eTypeObjectFile, /// An intermediate object file + eTypeSharedLibrary, /// A shared library that can be used during execution + eTypeStubLibrary, /// A library that can be linked against but not used for + /// execution + eTypeJIT, /// JIT code that has symbols, sections and possibly debug info + eTypeUnknown + } Type; + + typedef enum { + eStrataInvalid = 0, + eStrataUnknown, + eStrataUser, + eStrataKernel, + eStrataRawImage, + eStrataJIT + } Strata; + + //------------------------------------------------------------------ + /// Construct with a parent module, offset, and header data. + /// + /// Object files belong to modules and a valid module must be + /// supplied upon construction. The at an offset within a file for + /// objects that contain more than one architecture or object. + //------------------------------------------------------------------ + ObjectFile(const lldb::ModuleSP &module_sp, const FileSpec *file_spec_ptr, + lldb::offset_t file_offset, lldb::offset_t length, + const lldb::DataBufferSP &data_sp, lldb::offset_t data_offset); + + ObjectFile(const lldb::ModuleSP &module_sp, const lldb::ProcessSP &process_sp, + lldb::addr_t header_addr, lldb::DataBufferSP &data_sp); + + //------------------------------------------------------------------ + /// Destructor. + /// + /// The destructor is virtual since this class is designed to be + /// inherited from by the plug-in instance. + //------------------------------------------------------------------ + ~ObjectFile() override; + + //------------------------------------------------------------------ + /// Dump a description of this object to a Stream. + /// + /// Dump a description of the current contents of this object + /// to the supplied stream \a s. The dumping should include the + /// section list if it has been parsed, and the symbol table + /// if it has been parsed. + /// + /// @param[in] s + /// The stream to which to dump the object description. + //------------------------------------------------------------------ + virtual void Dump(Stream *s) = 0; + + //------------------------------------------------------------------ + /// Find a ObjectFile plug-in that can parse \a file_spec. + /// + /// Scans all loaded plug-in interfaces that implement versions of + /// the ObjectFile plug-in interface and returns the first + /// instance that can parse the file. + /// + /// @param[in] module + /// The parent module that owns this object file. + /// + /// @param[in] file_spec + /// A file specification that indicates which file to use as the + /// object file. + /// + /// @param[in] file_offset + /// The offset into the file at which to start parsing the + /// object. This is for files that contain multiple + /// architectures or objects. + /// + /// @param[in] file_size + /// The size of the current object file if it can be determined + /// or if it is known. This can be zero. + /// + /// @see ObjectFile::ParseHeader() + //------------------------------------------------------------------ + 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 a file in memory. + /// + /// Scans all loaded plug-in interfaces that implement versions of + /// the ObjectFile plug-in interface and returns the first + /// instance that can parse the file. + /// + /// @param[in] module + /// The parent module that owns this object file. + /// + /// @param[in] process_sp + /// A shared pointer to the process whose memory space contains + /// an object file. This will be stored as a std::weak_ptr. + /// + /// @param[in] header_addr + /// The address of the header for the object file in memory. + //------------------------------------------------------------------ + static lldb::ObjectFileSP FindPlugin(const lldb::ModuleSP &module_sp, + const lldb::ProcessSP &process_sp, + lldb::addr_t header_addr, + lldb::DataBufferSP &file_data_sp); + + static size_t GetModuleSpecifications(const FileSpec &file, + lldb::offset_t file_offset, + lldb::offset_t file_size, + ModuleSpecList &specs); + + 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); + //------------------------------------------------------------------ + /// Split a path into a file path with object name. + /// + /// For paths like "/tmp/foo.a(bar.o)" we often need to split a path + /// up into the actual path name and into the object name so we can + /// make a valid object file from it. + /// + /// @param[in] path_with_object + /// A path that might contain an archive path with a .o file + /// specified in parens in the basename of the path. + /// + /// @param[out] archive_file + /// If \b true is returned, \a file_spec will be filled in with + /// the path to the archive. + /// + /// @param[out] archive_object + /// If \b true is returned, \a object will be filled in with + /// the name of the object inside the archive. + /// + /// @return + /// \b true if the path matches the pattern of archive + object + /// and \a archive_file and \a archive_object are modified, + /// \b false otherwise and \a archive_file and \a archive_object + /// are guaranteed to be remain unchanged. + //------------------------------------------------------------------ + static bool SplitArchivePathWithObject( + const char *path_with_object, lldb_private::FileSpec &archive_file, + lldb_private::ConstString &archive_object, bool must_exist); + + //------------------------------------------------------------------ + /// Gets the address size in bytes for the current object file. + /// + /// @return + /// 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. + //------------------------------------------------------------------ + virtual uint32_t GetAddressByteSize() const = 0; + + //------------------------------------------------------------------ + /// 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 + /// @return + /// 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. + //------------------------------------------------------------------ + virtual lldb::AddressClass GetAddressClass(lldb::addr_t file_addr); + + //------------------------------------------------------------------ + /// 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. + /// + /// @param[out] file_list + /// A list of file specification objects that gets dependent + /// files appended to. + /// + /// @return + /// The number of new files that were appended to \a file_list. + /// + /// @see FileSpecList::AppendIfUnique(const FileSpec &) + //------------------------------------------------------------------ + virtual uint32_t GetDependentModules(FileSpecList &file_list) = 0; + + //------------------------------------------------------------------ + /// Tells whether this object file is capable of being the main executable + /// for a process. + /// + /// @return + /// \b true if it is, \b false otherwise. + //------------------------------------------------------------------ + virtual bool IsExecutable() const = 0; + + //------------------------------------------------------------------ + /// Returns the offset into a file at which this object resides. + /// + /// Some files contain many object files, and this function allows + /// access to an object's offset within the file. + /// + /// @return + /// The offset in bytes into the file. Defaults to zero for + /// simple object files that a represented by an entire file. + //------------------------------------------------------------------ + virtual lldb::addr_t GetFileOffset() const { return m_file_offset; } + + virtual lldb::addr_t GetByteSize() const { return m_length; } + + //------------------------------------------------------------------ + /// Get accessor to the object file specification. + /// + /// @return + /// The file specification object pointer if there is one, or + /// NULL if this object is only from memory. + //------------------------------------------------------------------ + virtual FileSpec &GetFileSpec() { return m_file; } + + //------------------------------------------------------------------ + /// Get const accessor to the object file specification. + /// + /// @return + /// The const file specification object pointer if there is one, + /// or NULL if this object is only from memory. + //------------------------------------------------------------------ + virtual const FileSpec &GetFileSpec() const { return m_file; } + + //------------------------------------------------------------------ + /// Get the name of the cpu, vendor and OS for this object file. + /// + /// This value is a string that represents the target triple where + /// the cpu type, the vendor and the OS are encoded into a string. + /// + /// @param[out] target_triple + /// The string value of the target triple. + /// + /// @return + /// \b True if the target triple was able to be computed, \b + /// false otherwise. + //------------------------------------------------------------------ + virtual bool GetArchitecture(ArchSpec &arch) = 0; + + //------------------------------------------------------------------ + /// Gets the section list for the currently selected architecture + /// (and object for archives). + /// + /// Section list parsing can be deferred by ObjectFile instances + /// until this accessor is called the first time. + /// + /// @return + /// The list of sections contained in this object file. + //------------------------------------------------------------------ + virtual SectionList *GetSectionList(bool update_module_section_list = true); + + virtual void CreateSections(SectionList &unified_section_list) = 0; + + //------------------------------------------------------------------ + /// Notify the ObjectFile that the file addresses in the Sections + /// for this module have been changed. + //------------------------------------------------------------------ + virtual void SectionFileAddressesChanged() {} + + //------------------------------------------------------------------ + /// Gets the symbol table for the currently selected architecture + /// (and object for archives). + /// + /// Symbol table parsing can be deferred by ObjectFile instances + /// until this accessor is called the first time. + /// + /// @return + /// The symbol table for this object file. + //------------------------------------------------------------------ + virtual Symtab *GetSymtab() = 0; + + //------------------------------------------------------------------ + /// Appends a Symbol for the specified so_addr to the symbol table. + /// + /// If verify_unique is false, the symbol table is not searched + /// to determine if a Symbol found at this address has already been + /// added to the symbol table. When verify_unique is true, this + /// method resolves the Symbol as the first match in the SymbolTable + /// and appends a Symbol only if required/found. + /// + /// @return + /// The resolved symbol or nullptr. Returns nullptr if a + /// a Symbol could not be found for the specified so_addr. + //------------------------------------------------------------------ + virtual Symbol *ResolveSymbolForAddress(const Address &so_addr, + bool verify_unique) { + // Typically overridden to lazily add stripped symbols recoverable from + // the exception handling unwind information (i.e. without parsing + // the entire eh_frame section. + // + // The availability of LC_FUNCTION_STARTS allows ObjectFileMachO + // to efficiently add stripped symbols when the symbol table is + // first constructed. Poorer cousins are PECoff and ELF. + return nullptr; + } + + //------------------------------------------------------------------ + /// Detect if this object file has been stripped of local symbols. + //------------------------------------------------------------------ + /// Detect if this object file has been stripped of local symbols. + /// + /// @return + /// Return \b true if the object file has been stripped of local + /// symbols. + //------------------------------------------------------------------ + virtual bool IsStripped() = 0; + + //------------------------------------------------------------------ + /// Frees the symbol table. + /// + /// This function should only be used when an object file is + /// + /// @param[in] flags + /// eSymtabFromUnifiedSectionList: Whether to clear symbol table + /// for unified module section list, or object file. + /// + /// @return + /// The symbol table for this object file. + //------------------------------------------------------------------ + virtual void ClearSymtab(); + + //------------------------------------------------------------------ + /// 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). + /// + /// @return + /// Returns \b true if a UUID was successfully extracted into + /// \a uuid, \b false otherwise. + //------------------------------------------------------------------ + virtual bool GetUUID(lldb_private::UUID *uuid) = 0; + + //------------------------------------------------------------------ + /// Gets the symbol file spec list for this object file. + /// + /// If the object file format contains a debug symbol file link, + /// the values will be returned in the FileSpecList. + /// + /// @return + /// Returns filespeclist. + //------------------------------------------------------------------ + virtual lldb_private::FileSpecList GetDebugSymbolFilePaths() { + return FileSpecList(); + } + + //------------------------------------------------------------------ + /// Gets the file spec list of libraries re-exported by this object file. + /// + /// If the object file format has the notion of one library re-exporting the + /// symbols from another, + /// the re-exported libraries will be returned in the FileSpecList. + /// + /// @return + /// Returns filespeclist. + //------------------------------------------------------------------ + virtual lldb_private::FileSpecList GetReExportedLibraries() { + return FileSpecList(); + } + + //------------------------------------------------------------------ + /// Sets the load address for an entire module, assuming a rigid + /// slide of sections, if possible in the implementation. + /// + /// @return + /// Returns true iff any section's load address changed. + //------------------------------------------------------------------ + virtual bool SetLoadAddress(Target &target, lldb::addr_t value, + bool value_is_offset) { + return false; + } + + //------------------------------------------------------------------ + /// Gets whether endian swapping should occur when extracting data + /// from this object file. + /// + /// @return + /// Returns \b true if endian swapping is needed, \b false + /// otherwise. + //------------------------------------------------------------------ + virtual lldb::ByteOrder GetByteOrder() const = 0; + + //------------------------------------------------------------------ + /// 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. + /// + /// @return + /// Returns \b true if the header was parsed successfully, \b + /// false otherwise. + //------------------------------------------------------------------ + virtual bool ParseHeader() = 0; + + //------------------------------------------------------------------ + /// Returns a reference to the UnwindTable for this ObjectFile + /// + /// The UnwindTable contains FuncUnwinders objects for any function in + /// this ObjectFile. If a FuncUnwinders object hasn't been created yet + /// (i.e. the function has yet to be unwound in a stack walk), it + /// will be created when requested. Specifically, we do not create + /// FuncUnwinders objects for functions until they are needed. + /// + /// @return + /// Returns the unwind table for this object file. + //------------------------------------------------------------------ + virtual lldb_private::UnwindTable &GetUnwindTable() { return m_unwind_table; } + + //------------------------------------------------------------------ + /// Returns if the function bounds for symbols in this symbol file + /// are likely accurate. + /// + /// The unwinder can emulate the instructions of functions to understand + /// prologue/epilogue code sequences, where registers are spilled on + /// the stack, etc. This feature relies on having the correct start + /// addresses of all functions. If the ObjectFile has a way to tell + /// that symbols have been stripped and there's no way to reconstruct + /// start addresses (e.g. LC_FUNCTION_STARTS on Mach-O, or eh_frame + /// unwind info), the ObjectFile should indicate that assembly emulation + /// should not be used for this module. + /// + /// It is uncommon for this to return false. An ObjectFile needs to + /// be sure that symbol start addresses are unavailable before false + /// is returned. If it is unclear, this should return true. + /// + /// @return + /// Returns true if assembly emulation should be used for this + /// module. + /// Only returns false if the ObjectFile is sure that symbol + /// addresses are insufficient for accurate assembly emulation. + //------------------------------------------------------------------ + virtual bool AllowAssemblyEmulationUnwindPlans() { return true; } + + //------------------------------------------------------------------ + /// 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. + /// + /// @return + /// The address of any auxiliary tables, or an invalid address if this + /// object file format does not support or contain such information. + virtual lldb_private::Address GetImageInfoAddress(Target *target) { + return Address(); + } + + //------------------------------------------------------------------ + /// 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. + /// + /// @return + /// Returns the entry address for this module. + //------------------------------------------------------------------ + virtual lldb_private::Address GetEntryPointAddress() { return Address(); } + + //------------------------------------------------------------------ + /// Returns the address that represents the header of this object + /// file. + /// + /// The header address is defined as where the header for the object + /// file is that describes the content of the file. If the header + /// doesn't appear in a section that is defined in the object file, + /// an address with no section is returned that has the file offset + /// set in the m_file_offset member of the lldb_private::Address object. + /// + /// @return + /// Returns the entry address for this module. + //------------------------------------------------------------------ + virtual lldb_private::Address GetHeaderAddress() { + return Address(m_memory_addr); + } + + virtual uint32_t GetNumThreadContexts() { return 0; } + + virtual lldb::RegisterContextSP + GetThreadContextAtIndex(uint32_t idx, lldb_private::Thread &thread) { + return lldb::RegisterContextSP(); + } + + //------------------------------------------------------------------ + /// 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. + /// + /// @return + /// The calculated file type for the current object file. + //------------------------------------------------------------------ + virtual Type CalculateType() = 0; + + //------------------------------------------------------------------ + /// In cases where the type can't be calculated (elf files), this + /// routine allows someone to explicitly set it. As an example, + /// SymbolVendorELF uses this routine to set eTypeDebugInfo when + /// loading debug link files. + virtual void SetType(Type type) { m_type = type; } + + //------------------------------------------------------------------ + /// 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. + /// + /// @return + /// The calculated object file strata for the current object + /// file. + //------------------------------------------------------------------ + virtual Strata CalculateStrata() = 0; + + //------------------------------------------------------------------ + /// Get the object file version numbers. + /// + /// Many object files have a set of version numbers that describe + /// the version of the executable or shared library. Typically there + /// are major, minor and build, but there may be more. This function + /// will extract the versions from object files if they are available. + /// + /// If \a versions is NULL, or if \a num_versions is 0, the return + /// value will indicate how many version numbers are available in + /// this object file. Then a subsequent call can be made to this + /// function with a value of \a versions and \a num_versions that + /// has enough storage to store some or all version numbers. + /// + /// @param[out] versions + /// A pointer to an array of uint32_t types that is \a num_versions + /// long. If this value is NULL, the return value will indicate + /// how many version numbers are required for a subsequent call + /// to this function so that all versions can be retrieved. If + /// the value is non-NULL, then at most \a num_versions of the + /// existing versions numbers will be filled into \a versions. + /// If there is no version information available, \a versions + /// will be filled with \a num_versions UINT32_MAX values + /// and zero will be returned. + /// + /// @param[in] num_versions + /// The maximum number of entries to fill into \a versions. If + /// this value is zero, then the return value will indicate + /// how many version numbers there are in total so another call + /// to this function can be make with adequate storage in + /// \a versions to get all of the version numbers. If \a + /// num_versions is less than the actual number of version + /// numbers in this object file, only \a num_versions will be + /// filled into \a versions (if \a versions is non-NULL). + /// + /// @return + /// This function always returns the number of version numbers + /// that this object file has regardless of the number of + /// version numbers that were copied into \a versions. + //------------------------------------------------------------------ + virtual uint32_t GetVersion(uint32_t *versions, uint32_t num_versions) { + if (versions && num_versions) { + for (uint32_t i = 0; i < num_versions; ++i) + versions[i] = UINT32_MAX; } - - //------------------------------------------------------------------ - /// Gets whether endian swapping should occur when extracting data - /// from this object file. - /// - /// @return - /// Returns \b true if endian swapping is needed, \b false - /// otherwise. - //------------------------------------------------------------------ - virtual lldb::ByteOrder - GetByteOrder () const = 0; - - //------------------------------------------------------------------ - /// 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. - /// - /// @return - /// Returns \b true if the header was parsed successfully, \b - /// false otherwise. - //------------------------------------------------------------------ - virtual bool - ParseHeader () = 0; - - //------------------------------------------------------------------ - /// Returns a reference to the UnwindTable for this ObjectFile - /// - /// The UnwindTable contains FuncUnwinders objects for any function in - /// this ObjectFile. If a FuncUnwinders object hasn't been created yet - /// (i.e. the function has yet to be unwound in a stack walk), it - /// will be created when requested. Specifically, we do not create - /// FuncUnwinders objects for functions until they are needed. - /// - /// @return - /// Returns the unwind table for this object file. - //------------------------------------------------------------------ - virtual lldb_private::UnwindTable& - GetUnwindTable () { return m_unwind_table; } - - //------------------------------------------------------------------ - /// Returns if the function bounds for symbols in this symbol file - /// are likely accurate. - /// - /// The unwinder can emulate the instructions of functions to understand - /// prologue/epilogue code sequences, where registers are spilled on - /// the stack, etc. This feature relies on having the correct start - /// addresses of all functions. If the ObjectFile has a way to tell - /// that symbols have been stripped and there's no way to reconstruct - /// start addresses (e.g. LC_FUNCTION_STARTS on Mach-O, or eh_frame - /// unwind info), the ObjectFile should indicate that assembly emulation - /// should not be used for this module. - /// - /// It is uncommon for this to return false. An ObjectFile needs to - /// be sure that symbol start addresses are unavailable before false - /// is returned. If it is unclear, this should return true. - /// - /// @return - /// Returns true if assembly emulation should be used for this - /// module. - /// Only returns false if the ObjectFile is sure that symbol - /// addresses are insufficient for accurate assembly emulation. - //------------------------------------------------------------------ - virtual bool - AllowAssemblyEmulationUnwindPlans () - { - return true; - } - - //------------------------------------------------------------------ - /// 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. - /// - /// @return - /// The address of any auxiliary tables, or an invalid address if this - /// object file format does not support or contain such information. - virtual lldb_private::Address - GetImageInfoAddress (Target *target) { return Address(); } - - //------------------------------------------------------------------ - /// 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. - /// - /// @return - /// Returns the entry address for this module. - //------------------------------------------------------------------ - virtual lldb_private::Address - GetEntryPointAddress () { return Address();} - - //------------------------------------------------------------------ - /// Returns the address that represents the header of this object - /// file. - /// - /// The header address is defined as where the header for the object - /// file is that describes the content of the file. If the header - /// doesn't appear in a section that is defined in the object file, - /// an address with no section is returned that has the file offset - /// set in the m_file_offset member of the lldb_private::Address object. - /// - /// @return - /// Returns the entry address for this module. - //------------------------------------------------------------------ - virtual lldb_private::Address - GetHeaderAddress () { return Address(m_memory_addr);} - - virtual uint32_t - GetNumThreadContexts () - { - return 0; - } - - virtual lldb::RegisterContextSP - GetThreadContextAtIndex (uint32_t idx, lldb_private::Thread &thread) - { - return lldb::RegisterContextSP(); - } - - //------------------------------------------------------------------ - /// 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. - /// - /// @return - /// The calculated file type for the current object file. - //------------------------------------------------------------------ - virtual Type - CalculateType() = 0; - - //------------------------------------------------------------------ - /// In cases where the type can't be calculated (elf files), this - /// routine allows someone to explicitly set it. As an example, - /// SymbolVendorELF uses this routine to set eTypeDebugInfo when - /// loading debug link files. - virtual void - SetType (Type type) - { - m_type = type; - } - - //------------------------------------------------------------------ - /// 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. - /// - /// @return - /// The calculated object file strata for the current object - /// file. - //------------------------------------------------------------------ - virtual Strata - CalculateStrata() = 0; - - //------------------------------------------------------------------ - /// Get the object file version numbers. - /// - /// Many object files have a set of version numbers that describe - /// the version of the executable or shared library. Typically there - /// are major, minor and build, but there may be more. This function - /// will extract the versions from object files if they are available. - /// - /// If \a versions is NULL, or if \a num_versions is 0, the return - /// value will indicate how many version numbers are available in - /// this object file. Then a subsequent call can be made to this - /// function with a value of \a versions and \a num_versions that - /// has enough storage to store some or all version numbers. - /// - /// @param[out] versions - /// A pointer to an array of uint32_t types that is \a num_versions - /// long. If this value is NULL, the return value will indicate - /// how many version numbers are required for a subsequent call - /// to this function so that all versions can be retrieved. If - /// the value is non-NULL, then at most \a num_versions of the - /// existing versions numbers will be filled into \a versions. - /// If there is no version information available, \a versions - /// will be filled with \a num_versions UINT32_MAX values - /// and zero will be returned. - /// - /// @param[in] num_versions - /// The maximum number of entries to fill into \a versions. If - /// this value is zero, then the return value will indicate - /// how many version numbers there are in total so another call - /// to this function can be make with adequate storage in - /// \a versions to get all of the version numbers. If \a - /// num_versions is less than the actual number of version - /// numbers in this object file, only \a num_versions will be - /// filled into \a versions (if \a versions is non-NULL). - /// - /// @return - /// This function always returns the number of version numbers - /// that this object file has regardless of the number of - /// version numbers that were copied into \a versions. - //------------------------------------------------------------------ - virtual uint32_t - GetVersion (uint32_t *versions, uint32_t num_versions) - { - if (versions && num_versions) - { - for (uint32_t i=0; i<num_versions; ++i) - versions[i] = UINT32_MAX; - } - return 0; - } - - //------------------------------------------------------------------ - /// Get the minimum OS version this object file can run on. - /// - /// Some object files have information that specifies the minimum OS - /// version that they can be used on. - /// - /// If \a versions is NULL, or if \a num_versions is 0, the return - /// value will indicate how many version numbers are available in - /// this object file. Then a subsequent call can be made to this - /// function with a value of \a versions and \a num_versions that - /// has enough storage to store some or all version numbers. - /// - /// @param[out] versions - /// A pointer to an array of uint32_t types that is \a num_versions - /// long. If this value is NULL, the return value will indicate - /// how many version numbers are required for a subsequent call - /// to this function so that all versions can be retrieved. If - /// the value is non-NULL, then at most \a num_versions of the - /// existing versions numbers will be filled into \a versions. - /// If there is no version information available, \a versions - /// will be filled with \a num_versions UINT32_MAX values - /// and zero will be returned. - /// - /// @param[in] num_versions - /// The maximum number of entries to fill into \a versions. If - /// this value is zero, then the return value will indicate - /// how many version numbers there are in total so another call - /// to this function can be make with adequate storage in - /// \a versions to get all of the version numbers. If \a - /// num_versions is less than the actual number of version - /// numbers in this object file, only \a num_versions will be - /// filled into \a versions (if \a versions is non-NULL). - /// - /// @return - /// This function always returns the number of version numbers - /// that this object file has regardless of the number of - /// version numbers that were copied into \a versions. - //------------------------------------------------------------------ - virtual uint32_t - GetMinimumOSVersion (uint32_t *versions, uint32_t num_versions) - { - if (versions && num_versions) - { - for (uint32_t i=0; i<num_versions; ++i) - versions[i] = UINT32_MAX; - } - return 0; + return 0; + } + + //------------------------------------------------------------------ + /// Get the minimum OS version this object file can run on. + /// + /// Some object files have information that specifies the minimum OS + /// version that they can be used on. + /// + /// If \a versions is NULL, or if \a num_versions is 0, the return + /// value will indicate how many version numbers are available in + /// this object file. Then a subsequent call can be made to this + /// function with a value of \a versions and \a num_versions that + /// has enough storage to store some or all version numbers. + /// + /// @param[out] versions + /// A pointer to an array of uint32_t types that is \a num_versions + /// long. If this value is NULL, the return value will indicate + /// how many version numbers are required for a subsequent call + /// to this function so that all versions can be retrieved. If + /// the value is non-NULL, then at most \a num_versions of the + /// existing versions numbers will be filled into \a versions. + /// If there is no version information available, \a versions + /// will be filled with \a num_versions UINT32_MAX values + /// and zero will be returned. + /// + /// @param[in] num_versions + /// The maximum number of entries to fill into \a versions. If + /// this value is zero, then the return value will indicate + /// how many version numbers there are in total so another call + /// to this function can be make with adequate storage in + /// \a versions to get all of the version numbers. If \a + /// num_versions is less than the actual number of version + /// numbers in this object file, only \a num_versions will be + /// filled into \a versions (if \a versions is non-NULL). + /// + /// @return + /// This function always returns the number of version numbers + /// that this object file has regardless of the number of + /// version numbers that were copied into \a versions. + //------------------------------------------------------------------ + virtual uint32_t GetMinimumOSVersion(uint32_t *versions, + uint32_t num_versions) { + if (versions && num_versions) { + for (uint32_t i = 0; i < num_versions; ++i) + versions[i] = UINT32_MAX; } - - //------------------------------------------------------------------ - /// Get the SDK OS version this object file was built with. - /// - /// The versions arguments and returns values are the same as the - /// GetMinimumOSVersion() - //------------------------------------------------------------------ - virtual uint32_t - GetSDKVersion (uint32_t *versions, uint32_t num_versions) - { - if (versions && num_versions) - { - for (uint32_t i=0; i<num_versions; ++i) - versions[i] = UINT32_MAX; - } - return 0; - } - - //------------------------------------------------------------------ - /// Return true if this file is a dynamic link editor (dyld) - /// - /// Often times dyld has symbols that mirror symbols in libc and - /// other shared libraries (like "malloc" and "free") and the user - /// does _not_ want to stop in these shared libraries by default. - /// We can ask the ObjectFile if it is such a file and should be - /// avoided for things like settings breakpoints and doing function - /// lookups for expressions. - //------------------------------------------------------------------ - virtual bool - GetIsDynamicLinkEditor() - { - return false; - } - - //------------------------------------------------------------------ - // Member Functions - //------------------------------------------------------------------ - Type - GetType () - { - if (m_type == eTypeInvalid) - m_type = CalculateType(); - return m_type; + return 0; + } + + //------------------------------------------------------------------ + /// Get the SDK OS version this object file was built with. + /// + /// The versions arguments and returns values are the same as the + /// GetMinimumOSVersion() + //------------------------------------------------------------------ + virtual uint32_t GetSDKVersion(uint32_t *versions, uint32_t num_versions) { + if (versions && num_versions) { + for (uint32_t i = 0; i < num_versions; ++i) + versions[i] = UINT32_MAX; } - - Strata - GetStrata () - { - if (m_strata == eStrataInvalid) - m_strata = CalculateStrata(); - return m_strata; - } - - // When an object file is in memory, subclasses should try and lock - // the process weak pointer. If the process weak pointer produces a - // valid ProcessSP, then subclasses can call this function to read - // memory. - static lldb::DataBufferSP - ReadMemory (const lldb::ProcessSP &process_sp, - lldb::addr_t addr, - size_t byte_size); - - 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 (const Section *section, - lldb::offset_t section_offset, - void *dst, - size_t dst_len) const; - - virtual size_t - ReadSectionData (const Section *section, - DataExtractor& section_data) const; - - size_t - MemoryMapSectionData (const Section *section, - DataExtractor& section_data) const; - - bool - IsInMemory () const - { - return m_memory_addr != LLDB_INVALID_ADDRESS; - } - - // Strip linker annotations (such as @@VERSION) from symbol names. - virtual std::string - StripLinkerSymbolAnnotations(llvm::StringRef symbol_name) const - { - return symbol_name.str(); - } - - static lldb::SymbolType - GetSymbolTypeFromName (llvm::StringRef name, - lldb::SymbolType symbol_type_hint = lldb::eSymbolTypeUndefined); + return 0; + } + + //------------------------------------------------------------------ + /// Return true if this file is a dynamic link editor (dyld) + /// + /// Often times dyld has symbols that mirror symbols in libc and + /// other shared libraries (like "malloc" and "free") and the user + /// does _not_ want to stop in these shared libraries by default. + /// We can ask the ObjectFile if it is such a file and should be + /// avoided for things like settings breakpoints and doing function + /// lookups for expressions. + //------------------------------------------------------------------ + virtual bool GetIsDynamicLinkEditor() { return false; } + + //------------------------------------------------------------------ + // Member Functions + //------------------------------------------------------------------ + Type GetType() { + if (m_type == eTypeInvalid) + m_type = CalculateType(); + return m_type; + } + + Strata GetStrata() { + if (m_strata == eStrataInvalid) + m_strata = CalculateStrata(); + return m_strata; + } + + // When an object file is in memory, subclasses should try and lock + // the process weak pointer. If the process weak pointer produces a + // valid ProcessSP, then subclasses can call this function to read + // memory. + static lldb::DataBufferSP ReadMemory(const lldb::ProcessSP &process_sp, + lldb::addr_t addr, size_t byte_size); + + 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(const Section *section, + lldb::offset_t section_offset, void *dst, + size_t dst_len) const; + + virtual size_t ReadSectionData(const Section *section, + DataExtractor §ion_data) const; + + size_t MemoryMapSectionData(const Section *section, + DataExtractor §ion_data) const; + + bool IsInMemory() const { return m_memory_addr != LLDB_INVALID_ADDRESS; } + + // Strip linker annotations (such as @@VERSION) from symbol names. + virtual std::string + StripLinkerSymbolAnnotations(llvm::StringRef symbol_name) const { + return symbol_name.str(); + } + + static lldb::SymbolType GetSymbolTypeFromName( + llvm::StringRef name, + lldb::SymbolType symbol_type_hint = lldb::eSymbolTypeUndefined); protected: - //------------------------------------------------------------------ - // Member variables. - //------------------------------------------------------------------ - 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_private::UnwindTable m_unwind_table; /// < Table of FuncUnwinders objects created for this ObjectFile's functions - lldb::ProcessWP m_process_wp; - const lldb::addr_t m_memory_addr; - std::unique_ptr<lldb_private::SectionList> m_sections_ap; - std::unique_ptr<lldb_private::Symtab> m_symtab_ap; - uint32_t m_synthetic_symbol_idx; - - //------------------------------------------------------------------ - /// Sets the architecture for a module. At present the architecture - /// can only be set if it is invalid. It is not allowed to switch from - /// one concrete architecture to another. - /// - /// @param[in] new_arch - /// The architecture this module will be set to. - /// - /// @return - /// Returns \b true if the architecture was changed, \b - /// false otherwise. - //------------------------------------------------------------------ - bool - SetModulesArchitecture (const ArchSpec &new_arch); - - ConstString - GetNextSyntheticSymbolName(); + //------------------------------------------------------------------ + // Member variables. + //------------------------------------------------------------------ + 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_private::UnwindTable m_unwind_table; /// < Table of FuncUnwinders objects + /// created for this ObjectFile's + /// functions + lldb::ProcessWP m_process_wp; + const lldb::addr_t m_memory_addr; + std::unique_ptr<lldb_private::SectionList> m_sections_ap; + std::unique_ptr<lldb_private::Symtab> m_symtab_ap; + uint32_t m_synthetic_symbol_idx; + + //------------------------------------------------------------------ + /// Sets the architecture for a module. At present the architecture + /// can only be set if it is invalid. It is not allowed to switch from + /// one concrete architecture to another. + /// + /// @param[in] new_arch + /// The architecture this module will be set to. + /// + /// @return + /// Returns \b true if the architecture was changed, \b + /// false otherwise. + //------------------------------------------------------------------ + bool SetModulesArchitecture(const ArchSpec &new_arch); + + ConstString GetNextSyntheticSymbolName(); private: - DISALLOW_COPY_AND_ASSIGN (ObjectFile); + DISALLOW_COPY_AND_ASSIGN(ObjectFile); }; } // namespace lldb_private |