summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h')
-rw-r--r--lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h225
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_
OpenPOWER on IntegriCloud