1f325ba9dSStephen Wilson //===-- ObjectFileELF.h --------------------------------------- -*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 1030fdc8d8SChris Lattner #ifndef liblldb_ObjectFileELF_h_ 1130fdc8d8SChris Lattner #define liblldb_ObjectFileELF_h_ 1230fdc8d8SChris Lattner 1330fdc8d8SChris Lattner #include <stdint.h> 1430fdc8d8SChris Lattner #include <vector> 1530fdc8d8SChris Lattner 1630fdc8d8SChris Lattner #include "lldb/lldb-private.h" 1730fdc8d8SChris Lattner #include "lldb/Core/FileSpec.h" 1830fdc8d8SChris Lattner #include "lldb/Symbol/ObjectFile.h" 1930fdc8d8SChris Lattner 20f325ba9dSStephen Wilson #include "ELFHeader.h" 2130fdc8d8SChris Lattner 22f325ba9dSStephen Wilson //------------------------------------------------------------------------------ 23f325ba9dSStephen Wilson /// @class ObjectFileELF 24f325ba9dSStephen Wilson /// @brief Generic ELF object file reader. 25f325ba9dSStephen Wilson /// 26f325ba9dSStephen Wilson /// This class provides a generic ELF (32/64 bit) reader plugin implementing the 27f325ba9dSStephen Wilson /// ObjectFile protocol. 2830fdc8d8SChris Lattner class ObjectFileELF : 2930fdc8d8SChris Lattner public lldb_private::ObjectFile 3030fdc8d8SChris Lattner { 3130fdc8d8SChris Lattner public: 3230fdc8d8SChris Lattner //------------------------------------------------------------------ 3330fdc8d8SChris Lattner // Static Functions 3430fdc8d8SChris Lattner //------------------------------------------------------------------ 3530fdc8d8SChris Lattner static void 3630fdc8d8SChris Lattner Initialize(); 3730fdc8d8SChris Lattner 3830fdc8d8SChris Lattner static void 3930fdc8d8SChris Lattner Terminate(); 4030fdc8d8SChris Lattner 4130fdc8d8SChris Lattner static const char * 4230fdc8d8SChris Lattner GetPluginNameStatic(); 4330fdc8d8SChris Lattner 4430fdc8d8SChris Lattner static const char * 4530fdc8d8SChris Lattner GetPluginDescriptionStatic(); 4630fdc8d8SChris Lattner 4730fdc8d8SChris Lattner static lldb_private::ObjectFile * 4830fdc8d8SChris Lattner CreateInstance(lldb_private::Module* module, 4930fdc8d8SChris Lattner lldb::DataBufferSP& dataSP, 5030fdc8d8SChris Lattner const lldb_private::FileSpec* file, 5130fdc8d8SChris Lattner lldb::addr_t offset, 5230fdc8d8SChris Lattner lldb::addr_t length); 5330fdc8d8SChris Lattner 5430fdc8d8SChris Lattner //------------------------------------------------------------------ 55f325ba9dSStephen Wilson // PluginInterface protocol 5630fdc8d8SChris Lattner //------------------------------------------------------------------ 57f325ba9dSStephen Wilson virtual const char * 58f325ba9dSStephen Wilson GetPluginName(); 5930fdc8d8SChris Lattner 60f325ba9dSStephen Wilson virtual const char * 61f325ba9dSStephen Wilson GetShortPluginName(); 62f325ba9dSStephen Wilson 63f325ba9dSStephen Wilson virtual uint32_t 64f325ba9dSStephen Wilson GetPluginVersion(); 65f325ba9dSStephen Wilson 66f325ba9dSStephen Wilson virtual void 67f325ba9dSStephen Wilson GetPluginCommandHelp(const char *command, lldb_private::Stream *strm); 68f325ba9dSStephen Wilson 69f325ba9dSStephen Wilson virtual lldb_private::Error 70f325ba9dSStephen Wilson ExecutePluginCommand(lldb_private::Args &command, 71f325ba9dSStephen Wilson lldb_private::Stream *strm); 72f325ba9dSStephen Wilson 73f325ba9dSStephen Wilson virtual lldb_private::Log * 74f325ba9dSStephen Wilson EnablePluginLogging(lldb_private::Stream *strm, 75f325ba9dSStephen Wilson lldb_private::Args &command); 76f325ba9dSStephen Wilson 77f325ba9dSStephen Wilson //------------------------------------------------------------------ 78f325ba9dSStephen Wilson // ObjectFile Protocol. 79f325ba9dSStephen Wilson //------------------------------------------------------------------ 8030fdc8d8SChris Lattner virtual 8130fdc8d8SChris Lattner ~ObjectFileELF(); 8230fdc8d8SChris Lattner 8330fdc8d8SChris Lattner virtual bool 8430fdc8d8SChris Lattner ParseHeader(); 8530fdc8d8SChris Lattner 8630fdc8d8SChris Lattner virtual lldb::ByteOrder 8730fdc8d8SChris Lattner GetByteOrder() const; 8830fdc8d8SChris Lattner 895aee162fSJim Ingham virtual bool 905aee162fSJim Ingham IsExecutable () const; 915aee162fSJim Ingham 9230fdc8d8SChris Lattner virtual size_t 9330fdc8d8SChris Lattner GetAddressByteSize() const; 9430fdc8d8SChris Lattner 9530fdc8d8SChris Lattner virtual lldb_private::Symtab * 9630fdc8d8SChris Lattner GetSymtab(); 9730fdc8d8SChris Lattner 9830fdc8d8SChris Lattner virtual lldb_private::SectionList * 9930fdc8d8SChris Lattner GetSectionList(); 10030fdc8d8SChris Lattner 10130fdc8d8SChris Lattner virtual void 10230fdc8d8SChris Lattner Dump(lldb_private::Stream *s); 10330fdc8d8SChris Lattner 10430fdc8d8SChris Lattner virtual bool 10530fdc8d8SChris Lattner GetTargetTriple(lldb_private::ConstString &target_triple); 10630fdc8d8SChris Lattner 10730fdc8d8SChris Lattner virtual bool 10830fdc8d8SChris Lattner GetUUID(lldb_private::UUID* uuid); 10930fdc8d8SChris Lattner 11030fdc8d8SChris Lattner virtual uint32_t 11130fdc8d8SChris Lattner GetDependentModules(lldb_private::FileSpecList& files); 11230fdc8d8SChris Lattner 113f325ba9dSStephen Wilson private: 114f325ba9dSStephen Wilson ObjectFileELF(lldb_private::Module* module, 115f325ba9dSStephen Wilson lldb::DataBufferSP& dataSP, 116f325ba9dSStephen Wilson const lldb_private::FileSpec* file, 117f325ba9dSStephen Wilson lldb::addr_t offset, 118f325ba9dSStephen Wilson lldb::addr_t length); 11930fdc8d8SChris Lattner 120f325ba9dSStephen Wilson typedef std::vector<elf::ELFProgramHeader> ProgramHeaderColl; 12130fdc8d8SChris Lattner typedef ProgramHeaderColl::iterator ProgramHeaderCollIter; 12230fdc8d8SChris Lattner typedef ProgramHeaderColl::const_iterator ProgramHeaderCollConstIter; 12330fdc8d8SChris Lattner 124f325ba9dSStephen Wilson typedef std::vector<elf::ELFSectionHeader> SectionHeaderColl; 12530fdc8d8SChris Lattner typedef SectionHeaderColl::iterator SectionHeaderCollIter; 12630fdc8d8SChris Lattner typedef SectionHeaderColl::const_iterator SectionHeaderCollConstIter; 12730fdc8d8SChris Lattner 128f325ba9dSStephen Wilson /// Version of this reader common to all plugins based on this class. 129f325ba9dSStephen Wilson static const uint32_t m_plugin_version = 1; 130f325ba9dSStephen Wilson 131f325ba9dSStephen Wilson /// ELF file header. 132f325ba9dSStephen Wilson elf::ELFHeader m_header; 133f325ba9dSStephen Wilson 134f325ba9dSStephen Wilson /// Collection of program headers. 13530fdc8d8SChris Lattner ProgramHeaderColl m_program_headers; 136f325ba9dSStephen Wilson 137f325ba9dSStephen Wilson /// Collection of section headers. 13830fdc8d8SChris Lattner SectionHeaderColl m_section_headers; 139f325ba9dSStephen Wilson 140f325ba9dSStephen Wilson /// List of sections present in this ELF object file. 14130fdc8d8SChris Lattner mutable std::auto_ptr<lldb_private::SectionList> m_sections_ap; 142f325ba9dSStephen Wilson 143f325ba9dSStephen Wilson /// Table of all non-dynamic symbols present in this object file. 14430fdc8d8SChris Lattner mutable std::auto_ptr<lldb_private::Symtab> m_symtab_ap; 145f325ba9dSStephen Wilson 146f325ba9dSStephen Wilson /// List of file specifications corresponding to the modules (shared 147f325ba9dSStephen Wilson /// libraries) on which this object file depends. 148f325ba9dSStephen Wilson mutable std::auto_ptr<lldb_private::FileSpecList> m_filespec_ap; 149f325ba9dSStephen Wilson 150f325ba9dSStephen Wilson /// Data extractor holding the string table used to resolve section names. 15130fdc8d8SChris Lattner lldb_private::DataExtractor m_shstr_data; 15230fdc8d8SChris Lattner 153f325ba9dSStephen Wilson /// Returns a 1 based index of the given section header. 154f325ba9dSStephen Wilson unsigned 155f325ba9dSStephen Wilson SectionIndex(const SectionHeaderCollIter &I); 156f325ba9dSStephen Wilson 157f325ba9dSStephen Wilson /// Returns a 1 based index of the given section header. 158f325ba9dSStephen Wilson unsigned 159f325ba9dSStephen Wilson SectionIndex(const SectionHeaderCollConstIter &I) const; 160f325ba9dSStephen Wilson 161f325ba9dSStephen Wilson /// Parses all section headers present in this object file and populates 162f325ba9dSStephen Wilson /// m_program_headers. This method will compute the header list only once. 163f325ba9dSStephen Wilson /// Returns the number of headers parsed. 16430fdc8d8SChris Lattner size_t 165f325ba9dSStephen Wilson ParseProgramHeaders(); 16630fdc8d8SChris Lattner 167f325ba9dSStephen Wilson /// Parses all section headers present in this object file and populates 168f325ba9dSStephen Wilson /// m_section_headers. This method will compute the header list only once. 169f325ba9dSStephen Wilson /// Returns the number of headers parsed. 17030fdc8d8SChris Lattner size_t 171f325ba9dSStephen Wilson ParseSectionHeaders(); 17230fdc8d8SChris Lattner 173f325ba9dSStephen Wilson /// Scans the dynamic section and locates all dependent modules (shared 174*710dd5aeSGreg Clayton /// libraries) populating m_filespec_ap. This method will compute the 175f325ba9dSStephen Wilson /// dependent module list only once. Returns the number of dependent 176f325ba9dSStephen Wilson /// modules parsed. 177f325ba9dSStephen Wilson size_t 178f325ba9dSStephen Wilson ParseDependentModules(); 17930fdc8d8SChris Lattner 180f325ba9dSStephen Wilson /// Populates m_symtab_ap will all non-dynamic linker symbols. This method 181f325ba9dSStephen Wilson /// will parse the symbols only once. Returns the number of symbols parsed. 182f325ba9dSStephen Wilson void 183f325ba9dSStephen Wilson ParseSymbolTable(lldb_private::Symtab *symbol_table, 184f325ba9dSStephen Wilson const elf::ELFSectionHeader &symtab_section, 185f325ba9dSStephen Wilson lldb::user_id_t symtab_id); 186f325ba9dSStephen Wilson 187f325ba9dSStephen Wilson /// Loads the section name string table into m_shstr_data. Returns the 188f325ba9dSStephen Wilson /// number of bytes constituting the table. 189f325ba9dSStephen Wilson size_t 190f325ba9dSStephen Wilson GetSectionHeaderStringTable(); 191f325ba9dSStephen Wilson 192f325ba9dSStephen Wilson /// Utility method for looking up a section given its name. Returns the 193f325ba9dSStephen Wilson /// index of the corresponding section or zero if no section with the given 194f325ba9dSStephen Wilson /// name can be found (note that section indices are always 1 based, and so 195f325ba9dSStephen Wilson /// section index 0 is never valid). 196f325ba9dSStephen Wilson lldb::user_id_t 197f325ba9dSStephen Wilson GetSectionIndexByName(const char *name); 198f325ba9dSStephen Wilson 199f325ba9dSStephen Wilson /// @name ELF header dump routines 200f325ba9dSStephen Wilson //@{ 20130fdc8d8SChris Lattner static void 202f325ba9dSStephen Wilson DumpELFHeader(lldb_private::Stream *s, const elf::ELFHeader& header); 20330fdc8d8SChris Lattner 20430fdc8d8SChris Lattner static void 20530fdc8d8SChris Lattner DumpELFHeader_e_ident_EI_DATA(lldb_private::Stream *s, 206f325ba9dSStephen Wilson unsigned char ei_data); 20730fdc8d8SChris Lattner 208f325ba9dSStephen Wilson static void 209f325ba9dSStephen Wilson DumpELFHeader_e_type(lldb_private::Stream *s, elf::elf_half e_type); 210f325ba9dSStephen Wilson //@} 211f325ba9dSStephen Wilson 212f325ba9dSStephen Wilson /// @name ELF program header dump routines 213f325ba9dSStephen Wilson //@{ 21430fdc8d8SChris Lattner void 21530fdc8d8SChris Lattner DumpELFProgramHeaders(lldb_private::Stream *s); 21630fdc8d8SChris Lattner 21730fdc8d8SChris Lattner static void 21830fdc8d8SChris Lattner DumpELFProgramHeader(lldb_private::Stream *s, 219f325ba9dSStephen Wilson const elf::ELFProgramHeader &ph); 22030fdc8d8SChris Lattner 22130fdc8d8SChris Lattner static void 222f325ba9dSStephen Wilson DumpELFProgramHeader_p_type(lldb_private::Stream *s, elf::elf_word p_type); 22330fdc8d8SChris Lattner 22430fdc8d8SChris Lattner static void 22530fdc8d8SChris Lattner DumpELFProgramHeader_p_flags(lldb_private::Stream *s, 226f325ba9dSStephen Wilson elf::elf_word p_flags); 227f325ba9dSStephen Wilson //@} 22830fdc8d8SChris Lattner 229f325ba9dSStephen Wilson /// @name ELF section header dump routines 230f325ba9dSStephen Wilson //@{ 23130fdc8d8SChris Lattner void 23230fdc8d8SChris Lattner DumpELFSectionHeaders(lldb_private::Stream *s); 23330fdc8d8SChris Lattner 23430fdc8d8SChris Lattner static void 23530fdc8d8SChris Lattner DumpELFSectionHeader(lldb_private::Stream *s, 236f325ba9dSStephen Wilson const elf::ELFSectionHeader& sh); 23730fdc8d8SChris Lattner 23830fdc8d8SChris Lattner static void 23930fdc8d8SChris Lattner DumpELFSectionHeader_sh_type(lldb_private::Stream *s, 240f325ba9dSStephen Wilson elf::elf_word sh_type); 24130fdc8d8SChris Lattner 24230fdc8d8SChris Lattner static void 24330fdc8d8SChris Lattner DumpELFSectionHeader_sh_flags(lldb_private::Stream *s, 244f325ba9dSStephen Wilson elf::elf_word sh_flags); 245f325ba9dSStephen Wilson //@} 24630fdc8d8SChris Lattner 247f325ba9dSStephen Wilson /// ELF dependent module dump routine. 248f325ba9dSStephen Wilson void 249f325ba9dSStephen Wilson DumpDependentModules(lldb_private::Stream *s); 25030fdc8d8SChris Lattner 25130fdc8d8SChris Lattner }; 25230fdc8d8SChris Lattner 25330fdc8d8SChris Lattner #endif // #ifndef liblldb_ObjectFileELF_h_ 254