ObjectFileELF.h revision 269024
1//===-- ObjectFileELF.h --------------------------------------- -*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef liblldb_ObjectFileELF_h_ 11#define liblldb_ObjectFileELF_h_ 12 13#include <stdint.h> 14#include <vector> 15 16#include "lldb/lldb-private.h" 17#include "lldb/Host/FileSpec.h" 18#include "lldb/Symbol/ObjectFile.h" 19#include "lldb/Core/UUID.h" 20 21#include "ELFHeader.h" 22 23struct ELFNote 24{ 25 elf::elf_word n_namesz; 26 elf::elf_word n_descsz; 27 elf::elf_word n_type; 28 29 std::string n_name; 30 31 ELFNote() : n_namesz(0), n_descsz(0), n_type(0) 32 { 33 } 34 35 /// Parse an ELFNote entry from the given DataExtractor starting at position 36 /// \p offset. 37 /// 38 /// @param[in] data 39 /// The DataExtractor to read from. 40 /// 41 /// @param[in,out] offset 42 /// Pointer to an offset in the data. On return the offset will be 43 /// advanced by the number of bytes read. 44 /// 45 /// @return 46 /// True if the ELFRel entry was successfully read and false otherwise. 47 bool 48 Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset); 49}; 50 51//------------------------------------------------------------------------------ 52/// @class ObjectFileELF 53/// @brief Generic ELF object file reader. 54/// 55/// This class provides a generic ELF (32/64 bit) reader plugin implementing the 56/// ObjectFile protocol. 57class ObjectFileELF : 58 public lldb_private::ObjectFile 59{ 60public: 61 //------------------------------------------------------------------ 62 // Static Functions 63 //------------------------------------------------------------------ 64 static void 65 Initialize(); 66 67 static void 68 Terminate(); 69 70 static lldb_private::ConstString 71 GetPluginNameStatic(); 72 73 static const char * 74 GetPluginDescriptionStatic(); 75 76 static lldb_private::ObjectFile * 77 CreateInstance(const lldb::ModuleSP &module_sp, 78 lldb::DataBufferSP& data_sp, 79 lldb::offset_t data_offset, 80 const lldb_private::FileSpec* file, 81 lldb::offset_t file_offset, 82 lldb::offset_t length); 83 84 static lldb_private::ObjectFile * 85 CreateMemoryInstance (const lldb::ModuleSP &module_sp, 86 lldb::DataBufferSP& data_sp, 87 const lldb::ProcessSP &process_sp, 88 lldb::addr_t header_addr); 89 90 static size_t 91 GetModuleSpecifications (const lldb_private::FileSpec& file, 92 lldb::DataBufferSP& data_sp, 93 lldb::offset_t data_offset, 94 lldb::offset_t file_offset, 95 lldb::offset_t length, 96 lldb_private::ModuleSpecList &specs); 97 98 static bool 99 MagicBytesMatch (lldb::DataBufferSP& data_sp, 100 lldb::addr_t offset, 101 lldb::addr_t length); 102 103 //------------------------------------------------------------------ 104 // PluginInterface protocol 105 //------------------------------------------------------------------ 106 virtual lldb_private::ConstString 107 GetPluginName(); 108 109 virtual uint32_t 110 GetPluginVersion(); 111 112 //------------------------------------------------------------------ 113 // ObjectFile Protocol. 114 //------------------------------------------------------------------ 115 virtual 116 ~ObjectFileELF(); 117 118 virtual bool 119 ParseHeader(); 120 121 virtual bool 122 SetLoadAddress (lldb_private::Target &target, 123 lldb::addr_t value, 124 bool value_is_offset); 125 126 virtual lldb::ByteOrder 127 GetByteOrder() const; 128 129 virtual bool 130 IsExecutable () const; 131 132 virtual uint32_t 133 GetAddressByteSize() const; 134 135 virtual lldb_private::Symtab * 136 GetSymtab(); 137 138 virtual lldb_private::Symbol * 139 ResolveSymbolForAddress(const lldb_private::Address& so_addr, bool verify_unique); 140 141 virtual bool 142 IsStripped (); 143 144 virtual void 145 CreateSections (lldb_private::SectionList &unified_section_list); 146 147 virtual void 148 Dump(lldb_private::Stream *s); 149 150 virtual bool 151 GetArchitecture (lldb_private::ArchSpec &arch); 152 153 virtual bool 154 GetUUID(lldb_private::UUID* uuid); 155 156 virtual lldb_private::FileSpecList 157 GetDebugSymbolFilePaths(); 158 159 virtual uint32_t 160 GetDependentModules(lldb_private::FileSpecList& files); 161 162 virtual lldb_private::Address 163 GetImageInfoAddress(lldb_private::Target *target); 164 165 virtual lldb_private::Address 166 GetEntryPointAddress (); 167 168 virtual ObjectFile::Type 169 CalculateType(); 170 171 virtual ObjectFile::Strata 172 CalculateStrata(); 173 174 // Returns number of program headers found in the ELF file. 175 size_t 176 GetProgramHeaderCount(); 177 178 // Returns the program header with the given index. 179 const elf::ELFProgramHeader * 180 GetProgramHeaderByIndex(lldb::user_id_t id); 181 182 // Returns segment data for the given index. 183 lldb_private::DataExtractor 184 GetSegmentDataByIndex(lldb::user_id_t id); 185 186private: 187 ObjectFileELF(const lldb::ModuleSP &module_sp, 188 lldb::DataBufferSP& data_sp, 189 lldb::offset_t data_offset, 190 const lldb_private::FileSpec* file, 191 lldb::offset_t offset, 192 lldb::offset_t length); 193 194 typedef std::vector<elf::ELFProgramHeader> ProgramHeaderColl; 195 typedef ProgramHeaderColl::iterator ProgramHeaderCollIter; 196 typedef ProgramHeaderColl::const_iterator ProgramHeaderCollConstIter; 197 198 struct ELFSectionHeaderInfo : public elf::ELFSectionHeader 199 { 200 lldb_private::ConstString section_name; 201 }; 202 typedef std::vector<ELFSectionHeaderInfo> SectionHeaderColl; 203 typedef SectionHeaderColl::iterator SectionHeaderCollIter; 204 typedef SectionHeaderColl::const_iterator SectionHeaderCollConstIter; 205 206 typedef std::vector<elf::ELFDynamic> DynamicSymbolColl; 207 typedef DynamicSymbolColl::iterator DynamicSymbolCollIter; 208 typedef DynamicSymbolColl::const_iterator DynamicSymbolCollConstIter; 209 210 /// Version of this reader common to all plugins based on this class. 211 static const uint32_t m_plugin_version = 1; 212 213 /// ELF file header. 214 elf::ELFHeader m_header; 215 216 /// ELF build ID. 217 lldb_private::UUID m_uuid; 218 219 /// ELF .gnu_debuglink file and crc data if available. 220 std::string m_gnu_debuglink_file; 221 uint32_t m_gnu_debuglink_crc; 222 223 /// Collection of program headers. 224 ProgramHeaderColl m_program_headers; 225 226 /// Collection of section headers. 227 SectionHeaderColl m_section_headers; 228 229 /// Collection of symbols from the dynamic table. 230 DynamicSymbolColl m_dynamic_symbols; 231 232 /// List of file specifications corresponding to the modules (shared 233 /// libraries) on which this object file depends. 234 mutable std::unique_ptr<lldb_private::FileSpecList> m_filespec_ap; 235 236 /// Cached value of the entry point for this module. 237 lldb_private::Address m_entry_point_address; 238 239 /// Returns a 1 based index of the given section header. 240 size_t 241 SectionIndex(const SectionHeaderCollIter &I); 242 243 /// Returns a 1 based index of the given section header. 244 size_t 245 SectionIndex(const SectionHeaderCollConstIter &I) const; 246 247 /// Parses all section headers present in this object file and populates 248 /// m_program_headers. This method will compute the header list only once. 249 /// Returns the number of headers parsed. 250 size_t 251 ParseProgramHeaders(); 252 253 /// Parses all section headers present in this object file and populates 254 /// m_section_headers. This method will compute the header list only once. 255 /// Returns the number of headers parsed. 256 size_t 257 ParseSectionHeaders(); 258 259 /// Parses the elf section headers and returns the uuid, debug link name, crc. 260 static size_t 261 GetSectionHeaderInfo(SectionHeaderColl §ion_headers, 262 lldb_private::DataExtractor &data, 263 const elf::ELFHeader &header, 264 lldb_private::UUID &uuid, 265 std::string &gnu_debuglink_file, 266 uint32_t &gnu_debuglink_crc); 267 268 /// Scans the dynamic section and locates all dependent modules (shared 269 /// libraries) populating m_filespec_ap. This method will compute the 270 /// dependent module list only once. Returns the number of dependent 271 /// modules parsed. 272 size_t 273 ParseDependentModules(); 274 275 /// Parses the dynamic symbol table and populates m_dynamic_symbols. The 276 /// vector retains the order as found in the object file. Returns the 277 /// number of dynamic symbols parsed. 278 size_t 279 ParseDynamicSymbols(); 280 281 /// Populates m_symtab_ap will all non-dynamic linker symbols. This method 282 /// will parse the symbols only once. Returns the number of symbols parsed. 283 unsigned 284 ParseSymbolTable(lldb_private::Symtab *symbol_table, 285 lldb::user_id_t start_id, 286 lldb_private::Section *symtab); 287 288 /// Helper routine for ParseSymbolTable(). 289 unsigned 290 ParseSymbols(lldb_private::Symtab *symbol_table, 291 lldb::user_id_t start_id, 292 lldb_private::SectionList *section_list, 293 const size_t num_symbols, 294 const lldb_private::DataExtractor &symtab_data, 295 const lldb_private::DataExtractor &strtab_data); 296 297 /// Scans the relocation entries and adds a set of artificial symbols to the 298 /// given symbol table for each PLT slot. Returns the number of symbols 299 /// added. 300 unsigned 301 ParseTrampolineSymbols(lldb_private::Symtab *symbol_table, 302 lldb::user_id_t start_id, 303 const ELFSectionHeaderInfo *rela_hdr, 304 lldb::user_id_t section_id); 305 306 /// Returns the section header with the given id or NULL. 307 const ELFSectionHeaderInfo * 308 GetSectionHeaderByIndex(lldb::user_id_t id); 309 310 /// @name ELF header dump routines 311 //@{ 312 static void 313 DumpELFHeader(lldb_private::Stream *s, const elf::ELFHeader& header); 314 315 static void 316 DumpELFHeader_e_ident_EI_DATA(lldb_private::Stream *s, 317 unsigned char ei_data); 318 319 static void 320 DumpELFHeader_e_type(lldb_private::Stream *s, elf::elf_half e_type); 321 //@} 322 323 /// @name ELF program header dump routines 324 //@{ 325 void 326 DumpELFProgramHeaders(lldb_private::Stream *s); 327 328 static void 329 DumpELFProgramHeader(lldb_private::Stream *s, 330 const elf::ELFProgramHeader &ph); 331 332 static void 333 DumpELFProgramHeader_p_type(lldb_private::Stream *s, elf::elf_word p_type); 334 335 static void 336 DumpELFProgramHeader_p_flags(lldb_private::Stream *s, 337 elf::elf_word p_flags); 338 //@} 339 340 /// @name ELF section header dump routines 341 //@{ 342 void 343 DumpELFSectionHeaders(lldb_private::Stream *s); 344 345 static void 346 DumpELFSectionHeader(lldb_private::Stream *s, 347 const ELFSectionHeaderInfo& sh); 348 349 static void 350 DumpELFSectionHeader_sh_type(lldb_private::Stream *s, 351 elf::elf_word sh_type); 352 353 static void 354 DumpELFSectionHeader_sh_flags(lldb_private::Stream *s, 355 elf::elf_xword sh_flags); 356 //@} 357 358 /// ELF dependent module dump routine. 359 void 360 DumpDependentModules(lldb_private::Stream *s); 361 362 const elf::ELFDynamic * 363 FindDynamicSymbol(unsigned tag); 364 365 unsigned 366 PLTRelocationType(); 367}; 368 369#endif // #ifndef liblldb_ObjectFileELF_h_ 370