diff options
Diffstat (limited to 'lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h')
-rw-r--r-- | lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h | 225 |
1 files changed, 139 insertions, 86 deletions
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h index 5d5778c78fb..7c941a70e0e 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h @@ -1,4 +1,4 @@ -//===-- ObjectFileELF.h -----------------------------------------*- C++ -*-===// +//===-- ObjectFileELF.h --------------------------------------- -*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -17,12 +17,14 @@ #include "lldb/Core/FileSpec.h" #include "lldb/Symbol/ObjectFile.h" -#include "elf.h" +#include "ELFHeader.h" -//---------------------------------------------------------------------- -// This class needs to be hidden as eventually belongs in a plugin that -// will export the ObjectFile protocol -//---------------------------------------------------------------------- +//------------------------------------------------------------------------------ +/// @class ObjectFileELF +/// @brief Generic ELF object file reader. +/// +/// This class provides a generic ELF (32/64 bit) reader plugin implementing the +/// ObjectFile protocol. class ObjectFileELF : public lldb_private::ObjectFile { @@ -43,34 +45,49 @@ public: GetPluginDescriptionStatic(); static lldb_private::ObjectFile * - CreateInstance (lldb_private::Module* module, - lldb::DataBufferSP& dataSP, - const lldb_private::FileSpec* file, - lldb::addr_t offset, - lldb::addr_t length); - static bool - MagicBytesMatch (lldb::DataBufferSP& dataSP); - - //------------------------------------------------------------------ - // Member Functions - //------------------------------------------------------------------ - ObjectFileELF (lldb_private::Module* module, + CreateInstance(lldb_private::Module* module, lldb::DataBufferSP& dataSP, const lldb_private::FileSpec* file, lldb::addr_t offset, lldb::addr_t length); + //------------------------------------------------------------------ + // PluginInterface protocol + //------------------------------------------------------------------ + virtual const char * + GetPluginName(); + + virtual const char * + GetShortPluginName(); + + virtual uint32_t + GetPluginVersion(); + + virtual void + GetPluginCommandHelp(const char *command, lldb_private::Stream *strm); + + virtual lldb_private::Error + ExecutePluginCommand(lldb_private::Args &command, + lldb_private::Stream *strm); + + virtual lldb_private::Log * + EnablePluginLogging(lldb_private::Stream *strm, + lldb_private::Args &command); + + //------------------------------------------------------------------ + // ObjectFile Protocol. + //------------------------------------------------------------------ virtual ~ObjectFileELF(); virtual bool - ParseHeader (); + ParseHeader(); virtual lldb::ByteOrder - GetByteOrder () const; + GetByteOrder() const; virtual size_t - GetAddressByteSize () const; + GetAddressByteSize() const; virtual lldb_private::Symtab * GetSymtab(); @@ -79,119 +96,155 @@ public: GetSectionList(); virtual void - Dump (lldb_private::Stream *s); + Dump(lldb_private::Stream *s); virtual bool - GetTargetTriple (lldb_private::ConstString &target_triple); + GetTargetTriple(lldb_private::ConstString &target_triple); virtual bool - GetUUID (lldb_private::UUID* uuid); + GetUUID(lldb_private::UUID* uuid); virtual uint32_t GetDependentModules(lldb_private::FileSpecList& files); - //------------------------------------------------------------------ - // PluginInterface protocol - //------------------------------------------------------------------ - virtual const char * - GetPluginName(); - - virtual const char * - GetShortPluginName(); - - virtual uint32_t - GetPluginVersion(); - - virtual void - GetPluginCommandHelp (const char *command, lldb_private::Stream *strm); - - virtual lldb_private::Error - ExecutePluginCommand (lldb_private::Args &command, lldb_private::Stream *strm); - - virtual lldb_private::Log * - EnablePluginLogging (lldb_private::Stream *strm, lldb_private::Args &command); - - +private: + ObjectFileELF(lldb_private::Module* module, + lldb::DataBufferSP& dataSP, + const lldb_private::FileSpec* file, + lldb::addr_t offset, + lldb::addr_t length); -protected: - typedef std::vector<Elf32_Phdr> ProgramHeaderColl; + typedef std::vector<elf::ELFProgramHeader> ProgramHeaderColl; typedef ProgramHeaderColl::iterator ProgramHeaderCollIter; typedef ProgramHeaderColl::const_iterator ProgramHeaderCollConstIter; - typedef std::vector<Elf32_Shdr> SectionHeaderColl; + typedef std::vector<elf::ELFSectionHeader> SectionHeaderColl; typedef SectionHeaderColl::iterator SectionHeaderCollIter; typedef SectionHeaderColl::const_iterator SectionHeaderCollConstIter; - Elf32_Ehdr m_header; + /// Version of this reader common to all plugins based on this class. + static const uint32_t m_plugin_version = 1; + + /// ELF file header. + elf::ELFHeader m_header; + + /// Collection of program headers. ProgramHeaderColl m_program_headers; + + /// Collection of section headers. SectionHeaderColl m_section_headers; + + /// List of sections present in this ELF object file. mutable std::auto_ptr<lldb_private::SectionList> m_sections_ap; + + /// Table of all non-dynamic symbols present in this object file. mutable std::auto_ptr<lldb_private::Symtab> m_symtab_ap; + + /// List of file specifications corresponding to the modules (shared + /// libraries) on which this object file depends. + mutable std::auto_ptr<lldb_private::FileSpecList> m_filespec_ap; + + /// Data extractor holding the string table used to resolve section names. lldb_private::DataExtractor m_shstr_data; + /// Returns a 1 based index of the given section header. + unsigned + SectionIndex(const SectionHeaderCollIter &I); + + /// Returns a 1 based index of the given section header. + unsigned + SectionIndex(const SectionHeaderCollConstIter &I) const; + + /// Parses all section headers present in this object file and populates + /// m_program_headers. This method will compute the header list only once. + /// Returns the number of headers parsed. size_t - ParseSections (); + ParseProgramHeaders(); + /// 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. size_t - ParseSymtab (bool minimize); + ParseSectionHeaders(); -private: + /// Scans the dynamic section and locates all dependent modules (shared + /// libaries) populating m_filespec_ap. This method will compute the + /// dependent module list only once. Returns the number of dependent + /// modules parsed. + size_t + ParseDependentModules(); + + /// Populates m_symtab_ap will all non-dynamic linker symbols. This method + /// will parse the symbols only once. Returns the number of symbols parsed. + void + ParseSymbolTable(lldb_private::Symtab *symbol_table, + const elf::ELFSectionHeader &symtab_section, + lldb::user_id_t symtab_id); + + /// Loads the section name string table into m_shstr_data. Returns the + /// number of bytes constituting the table. + size_t + GetSectionHeaderStringTable(); - // ELF header dump routines + /// 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). + lldb::user_id_t + GetSectionIndexByName(const char *name); + + /// @name ELF header dump routines + //@{ static void - DumpELFHeader (lldb_private::Stream *s, - const Elf32_Ehdr& header); + DumpELFHeader(lldb_private::Stream *s, const elf::ELFHeader& header); static void - DumpELFHeader_e_ident_EI_DATA (lldb_private::Stream *s, - uint16_t ei_data); + DumpELFHeader_e_ident_EI_DATA(lldb_private::Stream *s, + unsigned char ei_data); + static void - DumpELFHeader_e_type (lldb_private::Stream *s, - uint16_t e_type); + DumpELFHeader_e_type(lldb_private::Stream *s, elf::elf_half e_type); + //@} - // ELF program header dump routines + /// @name ELF program header dump routines + //@{ void - DumpELFProgramHeaders (lldb_private::Stream *s); + DumpELFProgramHeaders(lldb_private::Stream *s); static void - DumpELFProgramHeader (lldb_private::Stream *s, - const Elf32_Phdr& ph); + DumpELFProgramHeader(lldb_private::Stream *s, + const elf::ELFProgramHeader &ph); static void - DumpELFProgramHeader_p_type (lldb_private::Stream *s, - Elf32_Word p_type); + DumpELFProgramHeader_p_type(lldb_private::Stream *s, elf::elf_word p_type); static void - DumpELFProgramHeader_p_flags (lldb_private::Stream *s, - Elf32_Word p_flags); + DumpELFProgramHeader_p_flags(lldb_private::Stream *s, + elf::elf_word p_flags); + //@} - // ELF section header dump routines + /// @name ELF section header dump routines + //@{ void - DumpELFSectionHeaders (lldb_private::Stream *s); + DumpELFSectionHeaders(lldb_private::Stream *s); static void - DumpELFSectionHeader (lldb_private::Stream *s, - const Elf32_Shdr& sh); + DumpELFSectionHeader(lldb_private::Stream *s, + const elf::ELFSectionHeader& sh); static void - DumpELFSectionHeader_sh_type (lldb_private::Stream *s, - Elf32_Word sh_type); + DumpELFSectionHeader_sh_type(lldb_private::Stream *s, + elf::elf_word sh_type); static void - DumpELFSectionHeader_sh_flags (lldb_private::Stream *s, - Elf32_Word sh_flags); - - size_t - ParseProgramHeaders (); + DumpELFSectionHeader_sh_flags(lldb_private::Stream *s, + elf::elf_word sh_flags); + //@} - size_t - ParseSectionHeaders (); - - size_t - GetSectionHeaderStringTable (); + /// ELF dependent module dump routine. + void + DumpDependentModules(lldb_private::Stream *s); - uint32_t - GetSectionIndexByName (const char *name); }; #endif // #ifndef liblldb_ObjectFileELF_h_ |