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> 148157a887SEugene Zelenko 1530fdc8d8SChris Lattner #include <vector> 1630fdc8d8SChris Lattner 1730fdc8d8SChris Lattner #include "lldb/Symbol/ObjectFile.h" 185f19b907SPavel Labath #include "lldb/Utility/ArchSpec.h" 195713a05bSZachary Turner #include "lldb/Utility/FileSpec.h" 205713a05bSZachary Turner #include "lldb/Utility/UUID.h" 21b9c1b51eSKate Stone #include "lldb/lldb-private.h" 2230fdc8d8SChris Lattner 23f325ba9dSStephen Wilson #include "ELFHeader.h" 2430fdc8d8SChris Lattner 25b9c1b51eSKate Stone struct ELFNote { 26c113ff8cSEd Maste elf::elf_word n_namesz; 27c113ff8cSEd Maste elf::elf_word n_descsz; 28c113ff8cSEd Maste elf::elf_word n_type; 29c113ff8cSEd Maste 30c113ff8cSEd Maste std::string n_name; 31c113ff8cSEd Maste 32b9c1b51eSKate Stone ELFNote() : n_namesz(0), n_descsz(0), n_type(0) {} 33c113ff8cSEd Maste 34c113ff8cSEd Maste /// Parse an ELFNote entry from the given DataExtractor starting at position 35c113ff8cSEd Maste /// \p offset. 36c113ff8cSEd Maste /// 37c113ff8cSEd Maste /// @param[in] data 38c113ff8cSEd Maste /// The DataExtractor to read from. 39c113ff8cSEd Maste /// 40c113ff8cSEd Maste /// @param[in,out] offset 41c113ff8cSEd Maste /// Pointer to an offset in the data. On return the offset will be 42c113ff8cSEd Maste /// advanced by the number of bytes read. 43c113ff8cSEd Maste /// 44c113ff8cSEd Maste /// @return 45c113ff8cSEd Maste /// True if the ELFRel entry was successfully read and false otherwise. 46b9c1b51eSKate Stone bool Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset); 47b704b69eSGreg Clayton 48b9c1b51eSKate Stone size_t GetByteSize() const { 49a94ae1e0SRafael Espindola return 12 + llvm::alignTo(n_namesz, 4) + llvm::alignTo(n_descsz, 4); 50b704b69eSGreg Clayton } 51c113ff8cSEd Maste }; 52c113ff8cSEd Maste 53f325ba9dSStephen Wilson //------------------------------------------------------------------------------ 54f325ba9dSStephen Wilson /// @class ObjectFileELF 55d8f460e8SAdrian Prantl /// Generic ELF object file reader. 56f325ba9dSStephen Wilson /// 57d8f460e8SAdrian Prantl /// This class provides a generic ELF (32/64 bit) reader plugin implementing 58d8f460e8SAdrian Prantl /// the ObjectFile protocol. 59b9c1b51eSKate Stone class ObjectFileELF : public lldb_private::ObjectFile { 6030fdc8d8SChris Lattner public: 618157a887SEugene Zelenko ~ObjectFileELF() override; 628157a887SEugene Zelenko 6330fdc8d8SChris Lattner //------------------------------------------------------------------ 6430fdc8d8SChris Lattner // Static Functions 6530fdc8d8SChris Lattner //------------------------------------------------------------------ 66b9c1b51eSKate Stone static void Initialize(); 6730fdc8d8SChris Lattner 68b9c1b51eSKate Stone static void Terminate(); 6930fdc8d8SChris Lattner 70b9c1b51eSKate Stone static lldb_private::ConstString GetPluginNameStatic(); 7130fdc8d8SChris Lattner 72b9c1b51eSKate Stone static const char *GetPluginDescriptionStatic(); 7330fdc8d8SChris Lattner 7430fdc8d8SChris Lattner static lldb_private::ObjectFile * 75b9c1b51eSKate Stone CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP &data_sp, 76b9c1b51eSKate Stone lldb::offset_t data_offset, const lldb_private::FileSpec *file, 77b9c1b51eSKate Stone lldb::offset_t file_offset, lldb::offset_t length); 7830fdc8d8SChris Lattner 79b9c1b51eSKate Stone static lldb_private::ObjectFile *CreateMemoryInstance( 80b9c1b51eSKate Stone const lldb::ModuleSP &module_sp, lldb::DataBufferSP &data_sp, 81b9c1b51eSKate Stone const lldb::ProcessSP &process_sp, lldb::addr_t header_addr); 82c9660546SGreg Clayton 83b9c1b51eSKate Stone static size_t GetModuleSpecifications(const lldb_private::FileSpec &file, 84f4d6de6aSGreg Clayton lldb::DataBufferSP &data_sp, 85f4d6de6aSGreg Clayton lldb::offset_t data_offset, 86f4d6de6aSGreg Clayton lldb::offset_t file_offset, 87f4d6de6aSGreg Clayton lldb::offset_t length, 88f4d6de6aSGreg Clayton lldb_private::ModuleSpecList &specs); 899f0013d8SMichael Sartain 90b9c1b51eSKate Stone static bool MagicBytesMatch(lldb::DataBufferSP &data_sp, lldb::addr_t offset, 919f0013d8SMichael Sartain lldb::addr_t length); 929f0013d8SMichael Sartain 9330fdc8d8SChris Lattner //------------------------------------------------------------------ 94f325ba9dSStephen Wilson // PluginInterface protocol 9530fdc8d8SChris Lattner //------------------------------------------------------------------ 96b9c1b51eSKate Stone lldb_private::ConstString GetPluginName() override; 9730fdc8d8SChris Lattner 98b9c1b51eSKate Stone uint32_t GetPluginVersion() override; 99f325ba9dSStephen Wilson 100f325ba9dSStephen Wilson //------------------------------------------------------------------ 101f325ba9dSStephen Wilson // ObjectFile Protocol. 102f325ba9dSStephen Wilson //------------------------------------------------------------------ 103b9c1b51eSKate Stone bool ParseHeader() override; 10430fdc8d8SChris Lattner 105b9c1b51eSKate Stone bool SetLoadAddress(lldb_private::Target &target, lldb::addr_t value, 1066d06d905SGreg Clayton bool value_is_offset) override; 1079e02dacdSSteve Pucci 108b9c1b51eSKate Stone lldb::ByteOrder GetByteOrder() const override; 10930fdc8d8SChris Lattner 110b9c1b51eSKate Stone bool IsExecutable() const override; 1115aee162fSJim Ingham 112b9c1b51eSKate Stone uint32_t GetAddressByteSize() const override; 11330fdc8d8SChris Lattner 1149e1a117dSTatyana Krasnukha lldb_private::AddressClass GetAddressClass(lldb::addr_t file_addr) override; 115fbd703adSTodd Fiala 116b9c1b51eSKate Stone lldb_private::Symtab *GetSymtab() override; 11730fdc8d8SChris Lattner 118b9c1b51eSKate Stone bool IsStripped() override; 1193046e668SGreg Clayton 120b9c1b51eSKate Stone void CreateSections(lldb_private::SectionList &unified_section_list) override; 12130fdc8d8SChris Lattner 122b9c1b51eSKate Stone void Dump(lldb_private::Stream *s) override; 12330fdc8d8SChris Lattner 124b9c1b51eSKate Stone bool GetArchitecture(lldb_private::ArchSpec &arch) override; 12530fdc8d8SChris Lattner 126b9c1b51eSKate Stone bool GetUUID(lldb_private::UUID *uuid) override; 12730fdc8d8SChris Lattner 128b9c1b51eSKate Stone lldb_private::FileSpecList GetDebugSymbolFilePaths() override; 129a7499c98SMichael Sartain 130b9c1b51eSKate Stone uint32_t GetDependentModules(lldb_private::FileSpecList &files) override; 13130fdc8d8SChris Lattner 1326d06d905SGreg Clayton lldb_private::Address 1336d06d905SGreg Clayton GetImageInfoAddress(lldb_private::Target *target) override; 1342ab0a585SStephen Wilson 135b9c1b51eSKate Stone lldb_private::Address GetEntryPointAddress() override; 1369e00b6a6SGreg Clayton 137b9c1b51eSKate Stone ObjectFile::Type CalculateType() override; 1389e00b6a6SGreg Clayton 139b9c1b51eSKate Stone ObjectFile::Strata CalculateStrata() override; 140672e6f59SJim Ingham 141e2867bc4SPavel Labath size_t ReadSectionData(lldb_private::Section *section, 142e2867bc4SPavel Labath lldb::offset_t section_offset, void *dst, 143e2867bc4SPavel Labath size_t dst_len) override; 144e2867bc4SPavel Labath 145e2867bc4SPavel Labath size_t ReadSectionData(lldb_private::Section *section, 146e2867bc4SPavel Labath lldb_private::DataExtractor §ion_data) override; 147e2867bc4SPavel Labath 148*5ea7ecdbSPavel Labath llvm::ArrayRef<elf::ELFProgramHeader> ProgramHeaders(); 149*5ea7ecdbSPavel Labath lldb_private::DataExtractor GetSegmentData(const elf::ELFProgramHeader &H); 1504822d926SAshok Thirumurthi 1514d35d6b3SPavel Labath llvm::StringRef 152c6ae7eaaSPavel Labath StripLinkerSymbolAnnotations(llvm::StringRef symbol_name) const override; 153c6ae7eaaSPavel Labath 154d13f691fSEd Maste void RelocateSection(lldb_private::Section *section) override; 155d13f691fSEd Maste 15616064d35SPavel Labath protected: 15716064d35SPavel Labath 15816064d35SPavel Labath std::vector<LoadableData> 15916064d35SPavel Labath GetLoadableData(lldb_private::Target &target) override; 16016064d35SPavel Labath 161f325ba9dSStephen Wilson private: 162b9c1b51eSKate Stone ObjectFileELF(const lldb::ModuleSP &module_sp, lldb::DataBufferSP &data_sp, 163b9c1b51eSKate Stone lldb::offset_t data_offset, const lldb_private::FileSpec *file, 164b9c1b51eSKate Stone lldb::offset_t offset, lldb::offset_t length); 16530fdc8d8SChris Lattner 16617220c18SAndrew MacPherson ObjectFileELF(const lldb::ModuleSP &module_sp, 167f2561846STamas Berghammer lldb::DataBufferSP &header_data_sp, 168b9c1b51eSKate Stone const lldb::ProcessSP &process_sp, lldb::addr_t header_addr); 16917220c18SAndrew MacPherson 170f325ba9dSStephen Wilson typedef std::vector<elf::ELFProgramHeader> ProgramHeaderColl; 17130fdc8d8SChris Lattner 172b9c1b51eSKate Stone struct ELFSectionHeaderInfo : public elf::ELFSectionHeader { 173a7499c98SMichael Sartain lldb_private::ConstString section_name; 174a7499c98SMichael Sartain }; 1758157a887SEugene Zelenko 176a7499c98SMichael Sartain typedef std::vector<ELFSectionHeaderInfo> SectionHeaderColl; 17730fdc8d8SChris Lattner typedef SectionHeaderColl::iterator SectionHeaderCollIter; 17830fdc8d8SChris Lattner typedef SectionHeaderColl::const_iterator SectionHeaderCollConstIter; 17930fdc8d8SChris Lattner 180499b40e8SStephen Wilson typedef std::vector<elf::ELFDynamic> DynamicSymbolColl; 181499b40e8SStephen Wilson typedef DynamicSymbolColl::iterator DynamicSymbolCollIter; 182499b40e8SStephen Wilson typedef DynamicSymbolColl::const_iterator DynamicSymbolCollConstIter; 183499b40e8SStephen Wilson 1849e1a117dSTatyana Krasnukha typedef std::map<lldb::addr_t, lldb_private::AddressClass> 185b9c1b51eSKate Stone FileAddressToAddressClassMap; 18683544cf6STamas Berghammer 187f325ba9dSStephen Wilson /// Version of this reader common to all plugins based on this class. 188f325ba9dSStephen Wilson static const uint32_t m_plugin_version = 1; 1894339f3a4STodd Fiala static const uint32_t g_core_uuid_magic; 190f325ba9dSStephen Wilson 191f325ba9dSStephen Wilson /// ELF file header. 192f325ba9dSStephen Wilson elf::ELFHeader m_header; 193f325ba9dSStephen Wilson 194a7499c98SMichael Sartain /// ELF build ID. 195c836ae7dSMichael Sartain lldb_private::UUID m_uuid; 196c836ae7dSMichael Sartain 197a7499c98SMichael Sartain /// ELF .gnu_debuglink file and crc data if available. 198a7499c98SMichael Sartain std::string m_gnu_debuglink_file; 199a7499c98SMichael Sartain uint32_t m_gnu_debuglink_crc; 200a7499c98SMichael Sartain 201f325ba9dSStephen Wilson /// Collection of program headers. 20230fdc8d8SChris Lattner ProgramHeaderColl m_program_headers; 203f325ba9dSStephen Wilson 204f325ba9dSStephen Wilson /// Collection of section headers. 20530fdc8d8SChris Lattner SectionHeaderColl m_section_headers; 206f325ba9dSStephen Wilson 207499b40e8SStephen Wilson /// Collection of symbols from the dynamic table. 208499b40e8SStephen Wilson DynamicSymbolColl m_dynamic_symbols; 209499b40e8SStephen Wilson 210f325ba9dSStephen Wilson /// List of file specifications corresponding to the modules (shared 211f325ba9dSStephen Wilson /// libraries) on which this object file depends. 2127b0992d9SGreg Clayton mutable std::unique_ptr<lldb_private::FileSpecList> m_filespec_ap; 213f325ba9dSStephen Wilson 214672e6f59SJim Ingham /// Cached value of the entry point for this module. 215672e6f59SJim Ingham lldb_private::Address m_entry_point_address; 216672e6f59SJim Ingham 217b91de786STodd Fiala /// The architecture detected from parsing elf file contents. 218b91de786STodd Fiala lldb_private::ArchSpec m_arch_spec; 219b91de786STodd Fiala 22083544cf6STamas Berghammer /// The address class for each symbol in the elf file 22183544cf6STamas Berghammer FileAddressToAddressClassMap m_address_class_map; 22283544cf6STamas Berghammer 223f325ba9dSStephen Wilson /// Returns a 1 based index of the given section header. 224b9c1b51eSKate Stone size_t SectionIndex(const SectionHeaderCollIter &I); 225f325ba9dSStephen Wilson 226f325ba9dSStephen Wilson /// Returns a 1 based index of the given section header. 227b9c1b51eSKate Stone size_t SectionIndex(const SectionHeaderCollConstIter &I) const; 228f325ba9dSStephen Wilson 2294339f3a4STodd Fiala // Parses the ELF program headers. 230b9c1b51eSKate Stone static size_t GetProgramHeaderInfo(ProgramHeaderColl &program_headers, 231df1a0d11SPavel Labath lldb_private::DataExtractor &object_data, 2324339f3a4STodd Fiala const elf::ELFHeader &header); 2334339f3a4STodd Fiala 2344339f3a4STodd Fiala // Finds PT_NOTE segments and calculates their crc sum. 2354339f3a4STodd Fiala static uint32_t 2364339f3a4STodd Fiala CalculateELFNotesSegmentsCRC32(const ProgramHeaderColl &program_headers, 2374339f3a4STodd Fiala lldb_private::DataExtractor &data); 2384339f3a4STodd Fiala 239f325ba9dSStephen Wilson /// Parses all section headers present in this object file and populates 240f325ba9dSStephen Wilson /// m_program_headers. This method will compute the header list only once. 241*5ea7ecdbSPavel Labath /// Returns true iff the headers have been successfully parsed. 242*5ea7ecdbSPavel Labath bool ParseProgramHeaders(); 24330fdc8d8SChris Lattner 244f325ba9dSStephen Wilson /// Parses all section headers present in this object file and populates 245f325ba9dSStephen Wilson /// m_section_headers. This method will compute the header list only once. 246f325ba9dSStephen Wilson /// Returns the number of headers parsed. 247b9c1b51eSKate Stone size_t ParseSectionHeaders(); 24830fdc8d8SChris Lattner 249b9c1b51eSKate Stone static void ParseARMAttributes(lldb_private::DataExtractor &data, 250b9c1b51eSKate Stone uint64_t length, 251d2d15048SSaleem Abdulrasool lldb_private::ArchSpec &arch_spec); 252d2d15048SSaleem Abdulrasool 253d8f460e8SAdrian Prantl /// Parses the elf section headers and returns the uuid, debug link name, 254d8f460e8SAdrian Prantl /// crc, archspec. 255b9c1b51eSKate Stone static size_t GetSectionHeaderInfo(SectionHeaderColl §ion_headers, 256df1a0d11SPavel Labath lldb_private::DataExtractor &object_data, 257a7499c98SMichael Sartain const elf::ELFHeader &header, 258a7499c98SMichael Sartain lldb_private::UUID &uuid, 259a7499c98SMichael Sartain std::string &gnu_debuglink_file, 260b91de786STodd Fiala uint32_t &gnu_debuglink_crc, 261b91de786STodd Fiala lldb_private::ArchSpec &arch_spec); 262a7499c98SMichael Sartain 263f325ba9dSStephen Wilson /// Scans the dynamic section and locates all dependent modules (shared 264710dd5aeSGreg Clayton /// libraries) populating m_filespec_ap. This method will compute the 265f325ba9dSStephen Wilson /// dependent module list only once. Returns the number of dependent 266f325ba9dSStephen Wilson /// modules parsed. 267b9c1b51eSKate Stone size_t ParseDependentModules(); 26830fdc8d8SChris Lattner 269499b40e8SStephen Wilson /// Parses the dynamic symbol table and populates m_dynamic_symbols. The 270499b40e8SStephen Wilson /// vector retains the order as found in the object file. Returns the 271499b40e8SStephen Wilson /// number of dynamic symbols parsed. 272b9c1b51eSKate Stone size_t ParseDynamicSymbols(); 273499b40e8SStephen Wilson 274f325ba9dSStephen Wilson /// Populates m_symtab_ap will all non-dynamic linker symbols. This method 275f325ba9dSStephen Wilson /// will parse the symbols only once. Returns the number of symbols parsed. 276b9c1b51eSKate Stone unsigned ParseSymbolTable(lldb_private::Symtab *symbol_table, 277499b40e8SStephen Wilson lldb::user_id_t start_id, 2783046e668SGreg Clayton lldb_private::Section *symtab); 279f325ba9dSStephen Wilson 280a7499c98SMichael Sartain /// Helper routine for ParseSymbolTable(). 281b9c1b51eSKate Stone unsigned ParseSymbols(lldb_private::Symtab *symbol_table, 282a7499c98SMichael Sartain lldb::user_id_t start_id, 283a7499c98SMichael Sartain lldb_private::SectionList *section_list, 2843046e668SGreg Clayton const size_t num_symbols, 285a7499c98SMichael Sartain const lldb_private::DataExtractor &symtab_data, 286a7499c98SMichael Sartain const lldb_private::DataExtractor &strtab_data); 287a7499c98SMichael Sartain 288499b40e8SStephen Wilson /// Scans the relocation entries and adds a set of artificial symbols to the 289499b40e8SStephen Wilson /// given symbol table for each PLT slot. Returns the number of symbols 290499b40e8SStephen Wilson /// added. 291b9c1b51eSKate Stone unsigned ParseTrampolineSymbols(lldb_private::Symtab *symbol_table, 292499b40e8SStephen Wilson lldb::user_id_t start_id, 293a7499c98SMichael Sartain const ELFSectionHeaderInfo *rela_hdr, 294499b40e8SStephen Wilson lldb::user_id_t section_id); 295499b40e8SStephen Wilson 296b9c1b51eSKate Stone void ParseUnwindSymbols(lldb_private::Symtab *symbol_table, 2976b63b148STamas Berghammer lldb_private::DWARFCallFrameInfo *eh_frame); 2986b63b148STamas Berghammer 29917220c18SAndrew MacPherson /// Relocates debug sections 300b9c1b51eSKate Stone unsigned RelocateDebugSections(const elf::ELFSectionHeader *rel_hdr, 301d13f691fSEd Maste lldb::user_id_t rel_id, 302d13f691fSEd Maste lldb_private::Symtab *thetab); 30317220c18SAndrew MacPherson 304d13f691fSEd Maste unsigned ApplyRelocations(lldb_private::Symtab *symtab, 305b9c1b51eSKate Stone const elf::ELFHeader *hdr, 306b9c1b51eSKate Stone const elf::ELFSectionHeader *rel_hdr, 307b9c1b51eSKate Stone const elf::ELFSectionHeader *symtab_hdr, 308b9c1b51eSKate Stone const elf::ELFSectionHeader *debug_hdr, 309b9c1b51eSKate Stone lldb_private::DataExtractor &rel_data, 310b9c1b51eSKate Stone lldb_private::DataExtractor &symtab_data, 311b9c1b51eSKate Stone lldb_private::DataExtractor &debug_data, 312b9c1b51eSKate Stone lldb_private::Section *rel_section); 31317220c18SAndrew MacPherson 31417220c18SAndrew MacPherson /// Loads the section name string table into m_shstr_data. Returns the 31517220c18SAndrew MacPherson /// number of bytes constituting the table. 316b9c1b51eSKate Stone size_t GetSectionHeaderStringTable(); 31717220c18SAndrew MacPherson 31817220c18SAndrew MacPherson /// Utility method for looking up a section given its name. Returns the 31917220c18SAndrew MacPherson /// index of the corresponding section or zero if no section with the given 32017220c18SAndrew MacPherson /// name can be found (note that section indices are always 1 based, and so 32117220c18SAndrew MacPherson /// section index 0 is never valid). 322b9c1b51eSKate Stone lldb::user_id_t GetSectionIndexByName(const char *name); 32317220c18SAndrew MacPherson 32417220c18SAndrew MacPherson // Returns the ID of the first section that has the given type. 325b9c1b51eSKate Stone lldb::user_id_t GetSectionIndexByType(unsigned type); 32617220c18SAndrew MacPherson 327499b40e8SStephen Wilson /// Returns the section header with the given id or NULL. 328b9c1b51eSKate Stone const ELFSectionHeaderInfo *GetSectionHeaderByIndex(lldb::user_id_t id); 329499b40e8SStephen Wilson 330f325ba9dSStephen Wilson /// @name ELF header dump routines 331f325ba9dSStephen Wilson //@{ 332b9c1b51eSKate Stone static void DumpELFHeader(lldb_private::Stream *s, 333b9c1b51eSKate Stone const elf::ELFHeader &header); 33430fdc8d8SChris Lattner 335b9c1b51eSKate Stone static void DumpELFHeader_e_ident_EI_DATA(lldb_private::Stream *s, 336f325ba9dSStephen Wilson unsigned char ei_data); 33730fdc8d8SChris Lattner 338b9c1b51eSKate Stone static void DumpELFHeader_e_type(lldb_private::Stream *s, 339b9c1b51eSKate Stone elf::elf_half e_type); 340f325ba9dSStephen Wilson //@} 341f325ba9dSStephen Wilson 342f325ba9dSStephen Wilson /// @name ELF program header dump routines 343f325ba9dSStephen Wilson //@{ 344b9c1b51eSKate Stone void DumpELFProgramHeaders(lldb_private::Stream *s); 34530fdc8d8SChris Lattner 346b9c1b51eSKate Stone static void DumpELFProgramHeader(lldb_private::Stream *s, 347f325ba9dSStephen Wilson const elf::ELFProgramHeader &ph); 34830fdc8d8SChris Lattner 349b9c1b51eSKate Stone static void DumpELFProgramHeader_p_type(lldb_private::Stream *s, 350b9c1b51eSKate Stone elf::elf_word p_type); 35130fdc8d8SChris Lattner 352b9c1b51eSKate Stone static void DumpELFProgramHeader_p_flags(lldb_private::Stream *s, 353f325ba9dSStephen Wilson elf::elf_word p_flags); 354f325ba9dSStephen Wilson //@} 35530fdc8d8SChris Lattner 356f325ba9dSStephen Wilson /// @name ELF section header dump routines 357f325ba9dSStephen Wilson //@{ 358b9c1b51eSKate Stone void DumpELFSectionHeaders(lldb_private::Stream *s); 35930fdc8d8SChris Lattner 360b9c1b51eSKate Stone static void DumpELFSectionHeader(lldb_private::Stream *s, 361a7499c98SMichael Sartain const ELFSectionHeaderInfo &sh); 36230fdc8d8SChris Lattner 363b9c1b51eSKate Stone static void DumpELFSectionHeader_sh_type(lldb_private::Stream *s, 364f325ba9dSStephen Wilson elf::elf_word sh_type); 36530fdc8d8SChris Lattner 366b9c1b51eSKate Stone static void DumpELFSectionHeader_sh_flags(lldb_private::Stream *s, 367c7bece56SGreg Clayton elf::elf_xword sh_flags); 368f325ba9dSStephen Wilson //@} 36930fdc8d8SChris Lattner 370f325ba9dSStephen Wilson /// ELF dependent module dump routine. 371b9c1b51eSKate Stone void DumpDependentModules(lldb_private::Stream *s); 37230fdc8d8SChris Lattner 373b9c1b51eSKate Stone const elf::ELFDynamic *FindDynamicSymbol(unsigned tag); 374499b40e8SStephen Wilson 375b9c1b51eSKate Stone unsigned PLTRelocationType(); 376b91de786STodd Fiala 37797206d57SZachary Turner static lldb_private::Status 378b9c1b51eSKate Stone RefineModuleDetailsFromNote(lldb_private::DataExtractor &data, 379b9c1b51eSKate Stone lldb_private::ArchSpec &arch_spec, 380b9c1b51eSKate Stone lldb_private::UUID &uuid); 38116064d35SPavel Labath 38216064d35SPavel Labath bool AnySegmentHasPhysicalAddress(); 38330fdc8d8SChris Lattner }; 38430fdc8d8SChris Lattner 3858157a887SEugene Zelenko #endif // liblldb_ObjectFileELF_h_ 386