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" 1753239f00SGreg Clayton #include "lldb/Host/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 * 48e72dfb32SGreg Clayton CreateInstance(const lldb::ModuleSP &module_sp, 49*5ce9c565SGreg Clayton lldb::DataBufferSP& data_sp, 50*5ce9c565SGreg Clayton lldb::offset_t data_offset, 5130fdc8d8SChris Lattner const lldb_private::FileSpec* file, 52*5ce9c565SGreg Clayton lldb::offset_t file_offset, 53*5ce9c565SGreg Clayton lldb::offset_t length); 5430fdc8d8SChris Lattner 55c9660546SGreg Clayton static lldb_private::ObjectFile * 56e72dfb32SGreg Clayton CreateMemoryInstance (const lldb::ModuleSP &module_sp, 57c9660546SGreg Clayton lldb::DataBufferSP& data_sp, 58c9660546SGreg Clayton const lldb::ProcessSP &process_sp, 59c9660546SGreg Clayton lldb::addr_t header_addr); 60c9660546SGreg Clayton 6130fdc8d8SChris Lattner //------------------------------------------------------------------ 62f325ba9dSStephen Wilson // PluginInterface protocol 6330fdc8d8SChris Lattner //------------------------------------------------------------------ 64f325ba9dSStephen Wilson virtual const char * 65f325ba9dSStephen Wilson GetPluginName(); 6630fdc8d8SChris Lattner 67f325ba9dSStephen Wilson virtual const char * 68f325ba9dSStephen Wilson GetShortPluginName(); 69f325ba9dSStephen Wilson 70f325ba9dSStephen Wilson virtual uint32_t 71f325ba9dSStephen Wilson GetPluginVersion(); 72f325ba9dSStephen Wilson 73f325ba9dSStephen Wilson //------------------------------------------------------------------ 74f325ba9dSStephen Wilson // ObjectFile Protocol. 75f325ba9dSStephen Wilson //------------------------------------------------------------------ 7630fdc8d8SChris Lattner virtual 7730fdc8d8SChris Lattner ~ObjectFileELF(); 7830fdc8d8SChris Lattner 7930fdc8d8SChris Lattner virtual bool 8030fdc8d8SChris Lattner ParseHeader(); 8130fdc8d8SChris Lattner 8230fdc8d8SChris Lattner virtual lldb::ByteOrder 8330fdc8d8SChris Lattner GetByteOrder() const; 8430fdc8d8SChris Lattner 855aee162fSJim Ingham virtual bool 865aee162fSJim Ingham IsExecutable () const; 875aee162fSJim Ingham 88c7bece56SGreg Clayton virtual uint32_t 8930fdc8d8SChris Lattner GetAddressByteSize() const; 9030fdc8d8SChris Lattner 9130fdc8d8SChris Lattner virtual lldb_private::Symtab * 9230fdc8d8SChris Lattner GetSymtab(); 9330fdc8d8SChris Lattner 9430fdc8d8SChris Lattner virtual lldb_private::SectionList * 9530fdc8d8SChris Lattner GetSectionList(); 9630fdc8d8SChris Lattner 9730fdc8d8SChris Lattner virtual void 9830fdc8d8SChris Lattner Dump(lldb_private::Stream *s); 9930fdc8d8SChris Lattner 10030fdc8d8SChris Lattner virtual bool 101514487e8SGreg Clayton GetArchitecture (lldb_private::ArchSpec &arch); 10230fdc8d8SChris Lattner 10330fdc8d8SChris Lattner virtual bool 10430fdc8d8SChris Lattner GetUUID(lldb_private::UUID* uuid); 10530fdc8d8SChris Lattner 10630fdc8d8SChris Lattner virtual uint32_t 10730fdc8d8SChris Lattner GetDependentModules(lldb_private::FileSpecList& files); 10830fdc8d8SChris Lattner 1092ab0a585SStephen Wilson virtual lldb_private::Address 1102ab0a585SStephen Wilson GetImageInfoAddress(); 1112ab0a585SStephen Wilson 112672e6f59SJim Ingham virtual lldb_private::Address 113672e6f59SJim Ingham GetEntryPointAddress (); 1149e00b6a6SGreg Clayton 1159e00b6a6SGreg Clayton virtual ObjectFile::Type 1169e00b6a6SGreg Clayton CalculateType(); 1179e00b6a6SGreg Clayton 1189e00b6a6SGreg Clayton virtual ObjectFile::Strata 1199e00b6a6SGreg Clayton CalculateStrata(); 120672e6f59SJim Ingham 121f325ba9dSStephen Wilson private: 122e72dfb32SGreg Clayton ObjectFileELF(const lldb::ModuleSP &module_sp, 123*5ce9c565SGreg Clayton lldb::DataBufferSP& data_sp, 124*5ce9c565SGreg Clayton lldb::offset_t data_offset, 125f325ba9dSStephen Wilson const lldb_private::FileSpec* file, 126*5ce9c565SGreg Clayton lldb::offset_t offset, 127*5ce9c565SGreg Clayton lldb::offset_t length); 12830fdc8d8SChris Lattner 129f325ba9dSStephen Wilson typedef std::vector<elf::ELFProgramHeader> ProgramHeaderColl; 13030fdc8d8SChris Lattner typedef ProgramHeaderColl::iterator ProgramHeaderCollIter; 13130fdc8d8SChris Lattner typedef ProgramHeaderColl::const_iterator ProgramHeaderCollConstIter; 13230fdc8d8SChris Lattner 133f325ba9dSStephen Wilson typedef std::vector<elf::ELFSectionHeader> SectionHeaderColl; 13430fdc8d8SChris Lattner typedef SectionHeaderColl::iterator SectionHeaderCollIter; 13530fdc8d8SChris Lattner typedef SectionHeaderColl::const_iterator SectionHeaderCollConstIter; 13630fdc8d8SChris Lattner 137499b40e8SStephen Wilson typedef std::vector<elf::ELFDynamic> DynamicSymbolColl; 138499b40e8SStephen Wilson typedef DynamicSymbolColl::iterator DynamicSymbolCollIter; 139499b40e8SStephen Wilson typedef DynamicSymbolColl::const_iterator DynamicSymbolCollConstIter; 140499b40e8SStephen Wilson 141f325ba9dSStephen Wilson /// Version of this reader common to all plugins based on this class. 142f325ba9dSStephen Wilson static const uint32_t m_plugin_version = 1; 143f325ba9dSStephen Wilson 144f325ba9dSStephen Wilson /// ELF file header. 145f325ba9dSStephen Wilson elf::ELFHeader m_header; 146f325ba9dSStephen Wilson 147f325ba9dSStephen Wilson /// Collection of program headers. 14830fdc8d8SChris Lattner ProgramHeaderColl m_program_headers; 149f325ba9dSStephen Wilson 150f325ba9dSStephen Wilson /// Collection of section headers. 15130fdc8d8SChris Lattner SectionHeaderColl m_section_headers; 152f325ba9dSStephen Wilson 153499b40e8SStephen Wilson /// Collection of symbols from the dynamic table. 154499b40e8SStephen Wilson DynamicSymbolColl m_dynamic_symbols; 155499b40e8SStephen Wilson 156f325ba9dSStephen Wilson /// List of sections present in this ELF object file. 15730fdc8d8SChris Lattner mutable std::auto_ptr<lldb_private::SectionList> m_sections_ap; 158f325ba9dSStephen Wilson 159f325ba9dSStephen Wilson /// Table of all non-dynamic symbols present in this object file. 16030fdc8d8SChris Lattner mutable std::auto_ptr<lldb_private::Symtab> m_symtab_ap; 161f325ba9dSStephen Wilson 162f325ba9dSStephen Wilson /// List of file specifications corresponding to the modules (shared 163f325ba9dSStephen Wilson /// libraries) on which this object file depends. 164f325ba9dSStephen Wilson mutable std::auto_ptr<lldb_private::FileSpecList> m_filespec_ap; 165f325ba9dSStephen Wilson 166f325ba9dSStephen Wilson /// Data extractor holding the string table used to resolve section names. 16730fdc8d8SChris Lattner lldb_private::DataExtractor m_shstr_data; 16830fdc8d8SChris Lattner 169672e6f59SJim Ingham /// Cached value of the entry point for this module. 170672e6f59SJim Ingham lldb_private::Address m_entry_point_address; 171672e6f59SJim Ingham 172f325ba9dSStephen Wilson /// Returns a 1 based index of the given section header. 173c7bece56SGreg Clayton size_t 174f325ba9dSStephen Wilson SectionIndex(const SectionHeaderCollIter &I); 175f325ba9dSStephen Wilson 176f325ba9dSStephen Wilson /// Returns a 1 based index of the given section header. 177c7bece56SGreg Clayton size_t 178f325ba9dSStephen Wilson SectionIndex(const SectionHeaderCollConstIter &I) const; 179f325ba9dSStephen Wilson 180f325ba9dSStephen Wilson /// Parses all section headers present in this object file and populates 181f325ba9dSStephen Wilson /// m_program_headers. This method will compute the header list only once. 182f325ba9dSStephen Wilson /// Returns the number of headers parsed. 18330fdc8d8SChris Lattner size_t 184f325ba9dSStephen Wilson ParseProgramHeaders(); 18530fdc8d8SChris Lattner 186f325ba9dSStephen Wilson /// Parses all section headers present in this object file and populates 187f325ba9dSStephen Wilson /// m_section_headers. This method will compute the header list only once. 188f325ba9dSStephen Wilson /// Returns the number of headers parsed. 18930fdc8d8SChris Lattner size_t 190f325ba9dSStephen Wilson ParseSectionHeaders(); 19130fdc8d8SChris Lattner 192f325ba9dSStephen Wilson /// Scans the dynamic section and locates all dependent modules (shared 193710dd5aeSGreg Clayton /// libraries) populating m_filespec_ap. This method will compute the 194f325ba9dSStephen Wilson /// dependent module list only once. Returns the number of dependent 195f325ba9dSStephen Wilson /// modules parsed. 196f325ba9dSStephen Wilson size_t 197f325ba9dSStephen Wilson ParseDependentModules(); 19830fdc8d8SChris Lattner 199499b40e8SStephen Wilson /// Parses the dynamic symbol table and populates m_dynamic_symbols. The 200499b40e8SStephen Wilson /// vector retains the order as found in the object file. Returns the 201499b40e8SStephen Wilson /// number of dynamic symbols parsed. 202499b40e8SStephen Wilson size_t 203499b40e8SStephen Wilson ParseDynamicSymbols(); 204499b40e8SStephen Wilson 205f325ba9dSStephen Wilson /// Populates m_symtab_ap will all non-dynamic linker symbols. This method 206f325ba9dSStephen Wilson /// will parse the symbols only once. Returns the number of symbols parsed. 207499b40e8SStephen Wilson unsigned 208f325ba9dSStephen Wilson ParseSymbolTable(lldb_private::Symtab *symbol_table, 209499b40e8SStephen Wilson lldb::user_id_t start_id, 210499b40e8SStephen Wilson const elf::ELFSectionHeader *symtab_section, 211f325ba9dSStephen Wilson lldb::user_id_t symtab_id); 212f325ba9dSStephen Wilson 213499b40e8SStephen Wilson /// Scans the relocation entries and adds a set of artificial symbols to the 214499b40e8SStephen Wilson /// given symbol table for each PLT slot. Returns the number of symbols 215499b40e8SStephen Wilson /// added. 216499b40e8SStephen Wilson unsigned 217499b40e8SStephen Wilson ParseTrampolineSymbols(lldb_private::Symtab *symbol_table, 218499b40e8SStephen Wilson lldb::user_id_t start_id, 219499b40e8SStephen Wilson const elf::ELFSectionHeader *rela_hdr, 220499b40e8SStephen Wilson lldb::user_id_t section_id); 221499b40e8SStephen Wilson 222f325ba9dSStephen Wilson /// Loads the section name string table into m_shstr_data. Returns the 223f325ba9dSStephen Wilson /// number of bytes constituting the table. 224f325ba9dSStephen Wilson size_t 225f325ba9dSStephen Wilson GetSectionHeaderStringTable(); 226f325ba9dSStephen Wilson 227f325ba9dSStephen Wilson /// Utility method for looking up a section given its name. Returns the 228f325ba9dSStephen Wilson /// index of the corresponding section or zero if no section with the given 229f325ba9dSStephen Wilson /// name can be found (note that section indices are always 1 based, and so 230f325ba9dSStephen Wilson /// section index 0 is never valid). 231f325ba9dSStephen Wilson lldb::user_id_t 232f325ba9dSStephen Wilson GetSectionIndexByName(const char *name); 233f325ba9dSStephen Wilson 234499b40e8SStephen Wilson // Returns the ID of the first section that has the given type. 235499b40e8SStephen Wilson lldb::user_id_t 236499b40e8SStephen Wilson GetSectionIndexByType(unsigned type); 237499b40e8SStephen Wilson 238499b40e8SStephen Wilson /// Returns the section header with the given id or NULL. 239499b40e8SStephen Wilson const elf::ELFSectionHeader * 240499b40e8SStephen Wilson GetSectionHeaderByIndex(lldb::user_id_t id); 241499b40e8SStephen Wilson 242f325ba9dSStephen Wilson /// @name ELF header dump routines 243f325ba9dSStephen Wilson //@{ 24430fdc8d8SChris Lattner static void 245f325ba9dSStephen Wilson DumpELFHeader(lldb_private::Stream *s, const elf::ELFHeader& header); 24630fdc8d8SChris Lattner 24730fdc8d8SChris Lattner static void 24830fdc8d8SChris Lattner DumpELFHeader_e_ident_EI_DATA(lldb_private::Stream *s, 249f325ba9dSStephen Wilson unsigned char ei_data); 25030fdc8d8SChris Lattner 251f325ba9dSStephen Wilson static void 252f325ba9dSStephen Wilson DumpELFHeader_e_type(lldb_private::Stream *s, elf::elf_half e_type); 253f325ba9dSStephen Wilson //@} 254f325ba9dSStephen Wilson 255f325ba9dSStephen Wilson /// @name ELF program header dump routines 256f325ba9dSStephen Wilson //@{ 25730fdc8d8SChris Lattner void 25830fdc8d8SChris Lattner DumpELFProgramHeaders(lldb_private::Stream *s); 25930fdc8d8SChris Lattner 26030fdc8d8SChris Lattner static void 26130fdc8d8SChris Lattner DumpELFProgramHeader(lldb_private::Stream *s, 262f325ba9dSStephen Wilson const elf::ELFProgramHeader &ph); 26330fdc8d8SChris Lattner 26430fdc8d8SChris Lattner static void 265f325ba9dSStephen Wilson DumpELFProgramHeader_p_type(lldb_private::Stream *s, elf::elf_word p_type); 26630fdc8d8SChris Lattner 26730fdc8d8SChris Lattner static void 26830fdc8d8SChris Lattner DumpELFProgramHeader_p_flags(lldb_private::Stream *s, 269f325ba9dSStephen Wilson elf::elf_word p_flags); 270f325ba9dSStephen Wilson //@} 27130fdc8d8SChris Lattner 272f325ba9dSStephen Wilson /// @name ELF section header dump routines 273f325ba9dSStephen Wilson //@{ 27430fdc8d8SChris Lattner void 27530fdc8d8SChris Lattner DumpELFSectionHeaders(lldb_private::Stream *s); 27630fdc8d8SChris Lattner 27730fdc8d8SChris Lattner static void 27830fdc8d8SChris Lattner DumpELFSectionHeader(lldb_private::Stream *s, 279f325ba9dSStephen Wilson const elf::ELFSectionHeader& sh); 28030fdc8d8SChris Lattner 28130fdc8d8SChris Lattner static void 28230fdc8d8SChris Lattner DumpELFSectionHeader_sh_type(lldb_private::Stream *s, 283f325ba9dSStephen Wilson elf::elf_word sh_type); 28430fdc8d8SChris Lattner 28530fdc8d8SChris Lattner static void 28630fdc8d8SChris Lattner DumpELFSectionHeader_sh_flags(lldb_private::Stream *s, 287c7bece56SGreg Clayton elf::elf_xword sh_flags); 288f325ba9dSStephen Wilson //@} 28930fdc8d8SChris Lattner 290f325ba9dSStephen Wilson /// ELF dependent module dump routine. 291f325ba9dSStephen Wilson void 292f325ba9dSStephen Wilson DumpDependentModules(lldb_private::Stream *s); 29330fdc8d8SChris Lattner 294499b40e8SStephen Wilson const elf::ELFDynamic * 295499b40e8SStephen Wilson FindDynamicSymbol(unsigned tag); 296499b40e8SStephen Wilson 297499b40e8SStephen Wilson lldb_private::Section * 298499b40e8SStephen Wilson PLTSection(); 299499b40e8SStephen Wilson 300499b40e8SStephen Wilson unsigned 301499b40e8SStephen Wilson PLTRelocationType(); 30230fdc8d8SChris Lattner }; 30330fdc8d8SChris Lattner 30430fdc8d8SChris Lattner #endif // #ifndef liblldb_ObjectFileELF_h_ 305