Combine 32 and 64 bit ELF readers.
This patch provides a generic ELF reader plugin to handle both 32 and 64 bit
formats.
llvm-svn: 108292
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h
index 5d5778c..7c941a7 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,53 +45,12 @@
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);
- virtual
- ~ObjectFileELF();
-
- virtual bool
- ParseHeader ();
-
- virtual lldb::ByteOrder
- GetByteOrder () const;
-
- virtual size_t
- GetAddressByteSize () const;
-
- virtual lldb_private::Symtab *
- GetSymtab();
-
- virtual lldb_private::SectionList *
- GetSectionList();
-
- virtual void
- Dump (lldb_private::Stream *s);
-
- virtual bool
- GetTargetTriple (lldb_private::ConstString &target_triple);
-
- virtual bool
- GetUUID (lldb_private::UUID* uuid);
-
- virtual uint32_t
- GetDependentModules(lldb_private::FileSpecList& files);
-
//------------------------------------------------------------------
// PluginInterface protocol
//------------------------------------------------------------------
@@ -103,95 +64,187 @@
GetPluginVersion();
virtual void
- GetPluginCommandHelp (const char *command, lldb_private::Stream *strm);
+ GetPluginCommandHelp(const char *command, lldb_private::Stream *strm);
virtual lldb_private::Error
- ExecutePluginCommand (lldb_private::Args &command, lldb_private::Stream *strm);
+ ExecutePluginCommand(lldb_private::Args &command,
+ lldb_private::Stream *strm);
virtual lldb_private::Log *
- EnablePluginLogging (lldb_private::Stream *strm, lldb_private::Args &command);
+ EnablePluginLogging(lldb_private::Stream *strm,
+ lldb_private::Args &command);
+ //------------------------------------------------------------------
+ // ObjectFile Protocol.
+ //------------------------------------------------------------------
+ virtual
+ ~ObjectFileELF();
+ virtual bool
+ ParseHeader();
-protected:
- typedef std::vector<Elf32_Phdr> ProgramHeaderColl;
+ virtual lldb::ByteOrder
+ GetByteOrder() const;
+
+ virtual size_t
+ GetAddressByteSize() const;
+
+ virtual lldb_private::Symtab *
+ GetSymtab();
+
+ virtual lldb_private::SectionList *
+ GetSectionList();
+
+ virtual void
+ Dump(lldb_private::Stream *s);
+
+ virtual bool
+ GetTargetTriple(lldb_private::ConstString &target_triple);
+
+ virtual bool
+ GetUUID(lldb_private::UUID* uuid);
+
+ virtual uint32_t
+ GetDependentModules(lldb_private::FileSpecList& files);
+
+private:
+ ObjectFileELF(lldb_private::Module* module,
+ lldb::DataBufferSP& dataSP,
+ const lldb_private::FileSpec* file,
+ lldb::addr_t offset,
+ lldb::addr_t length);
+
+ 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();
- // ELF header dump routines
- static void
- DumpELFHeader (lldb_private::Stream *s,
- const Elf32_Ehdr& header);
-
- static void
- DumpELFHeader_e_ident_EI_DATA (lldb_private::Stream *s,
- uint16_t ei_data);
- static void
- DumpELFHeader_e_type (lldb_private::Stream *s,
- uint16_t e_type);
-
- // ELF program header dump routines
+ /// 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
- DumpELFProgramHeaders (lldb_private::Stream *s);
+ 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();
+
+ /// 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 elf::ELFHeader& header);
static void
- DumpELFProgramHeader (lldb_private::Stream *s,
- const Elf32_Phdr& ph);
+ DumpELFHeader_e_ident_EI_DATA(lldb_private::Stream *s,
+ unsigned char ei_data);
static void
- DumpELFProgramHeader_p_type (lldb_private::Stream *s,
- Elf32_Word p_type);
+ DumpELFHeader_e_type(lldb_private::Stream *s, elf::elf_half e_type);
+ //@}
- static void
- DumpELFProgramHeader_p_flags (lldb_private::Stream *s,
- Elf32_Word p_flags);
-
- // ELF section header dump routines
+ /// @name ELF program header dump routines
+ //@{
void
- DumpELFSectionHeaders (lldb_private::Stream *s);
+ DumpELFProgramHeaders(lldb_private::Stream *s);
static void
- DumpELFSectionHeader (lldb_private::Stream *s,
- const Elf32_Shdr& sh);
+ DumpELFProgramHeader(lldb_private::Stream *s,
+ const elf::ELFProgramHeader &ph);
static void
- DumpELFSectionHeader_sh_type (lldb_private::Stream *s,
- Elf32_Word sh_type);
+ DumpELFProgramHeader_p_type(lldb_private::Stream *s, elf::elf_word p_type);
static void
- DumpELFSectionHeader_sh_flags (lldb_private::Stream *s,
- Elf32_Word sh_flags);
+ DumpELFProgramHeader_p_flags(lldb_private::Stream *s,
+ elf::elf_word p_flags);
+ //@}
- size_t
- ParseProgramHeaders ();
+ /// @name ELF section header dump routines
+ //@{
+ void
+ DumpELFSectionHeaders(lldb_private::Stream *s);
- size_t
- ParseSectionHeaders ();
+ static void
+ DumpELFSectionHeader(lldb_private::Stream *s,
+ const elf::ELFSectionHeader& sh);
- size_t
- GetSectionHeaderStringTable ();
+ static void
+ DumpELFSectionHeader_sh_type(lldb_private::Stream *s,
+ elf::elf_word sh_type);
- uint32_t
- GetSectionIndexByName (const char *name);
+ static void
+ DumpELFSectionHeader_sh_flags(lldb_private::Stream *s,
+ elf::elf_word sh_flags);
+ //@}
+
+ /// ELF dependent module dump routine.
+ void
+ DumpDependentModules(lldb_private::Stream *s);
+
};
#endif // #ifndef liblldb_ObjectFileELF_h_