1f325ba9dSStephen Wilson //===-- ObjectFileELF.h --------------------------------------- -*- C++ -*-===// 230fdc8d8SChris Lattner // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 630fdc8d8SChris Lattner // 730fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 830fdc8d8SChris Lattner 9cdc514e4SJonas Devlieghere #ifndef LLDB_SOURCE_PLUGINS_OBJECTFILE_ELF_OBJECTFILEELF_H 10cdc514e4SJonas Devlieghere #define LLDB_SOURCE_PLUGINS_OBJECTFILE_ELF_OBJECTFILEELF_H 1130fdc8d8SChris Lattner 1276e47d48SRaphael Isemann #include <cstdint> 138157a887SEugene Zelenko 1430fdc8d8SChris Lattner #include <vector> 1530fdc8d8SChris Lattner 1630fdc8d8SChris Lattner #include "lldb/Symbol/ObjectFile.h" 175f19b907SPavel Labath #include "lldb/Utility/ArchSpec.h" 185713a05bSZachary Turner #include "lldb/Utility/FileSpec.h" 195713a05bSZachary Turner #include "lldb/Utility/UUID.h" 20b9c1b51eSKate Stone #include "lldb/lldb-private.h" 2130fdc8d8SChris Lattner 22f325ba9dSStephen Wilson #include "ELFHeader.h" 2330fdc8d8SChris Lattner 24b9c1b51eSKate Stone struct ELFNote { 259494c510SJonas Devlieghere elf::elf_word n_namesz = 0; 269494c510SJonas Devlieghere elf::elf_word n_descsz = 0; 279494c510SJonas Devlieghere elf::elf_word n_type = 0; 28c113ff8cSEd Maste 29c113ff8cSEd Maste std::string n_name; 30c113ff8cSEd Maste 31fd2433e1SJonas Devlieghere ELFNote() = default; 32c113ff8cSEd Maste 33c113ff8cSEd Maste /// Parse an ELFNote entry from the given DataExtractor starting at position 34c113ff8cSEd Maste /// \p offset. 35c113ff8cSEd Maste /// 36f05b42e9SAdrian Prantl /// \param[in] data 37c113ff8cSEd Maste /// The DataExtractor to read from. 38c113ff8cSEd Maste /// 39f05b42e9SAdrian Prantl /// \param[in,out] offset 40c113ff8cSEd Maste /// Pointer to an offset in the data. On return the offset will be 41c113ff8cSEd Maste /// advanced by the number of bytes read. 42c113ff8cSEd Maste /// 43f05b42e9SAdrian Prantl /// \return 44c113ff8cSEd Maste /// True if the ELFRel entry was successfully read and false otherwise. 45b9c1b51eSKate Stone bool Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset); 46b704b69eSGreg Clayton GetByteSizeELFNote47b9c1b51eSKate Stone size_t GetByteSize() const { 48a94ae1e0SRafael Espindola return 12 + llvm::alignTo(n_namesz, 4) + llvm::alignTo(n_descsz, 4); 49b704b69eSGreg Clayton } 50c113ff8cSEd Maste }; 51c113ff8cSEd Maste 52f05b42e9SAdrian Prantl /// \class ObjectFileELF 53d8f460e8SAdrian Prantl /// Generic ELF object file reader. 54f325ba9dSStephen Wilson /// 55d8f460e8SAdrian Prantl /// This class provides a generic ELF (32/64 bit) reader plugin implementing 56d8f460e8SAdrian Prantl /// the ObjectFile protocol. 57b9c1b51eSKate Stone class ObjectFileELF : public lldb_private::ObjectFile { 5830fdc8d8SChris Lattner public: 5930fdc8d8SChris Lattner // Static Functions 60b9c1b51eSKate Stone static void Initialize(); 6130fdc8d8SChris Lattner 62b9c1b51eSKate Stone static void Terminate(); 6330fdc8d8SChris Lattner GetPluginNameStatic()642ace1e57SPavel Labath static llvm::StringRef GetPluginNameStatic() { return "elf"; } 6530fdc8d8SChris Lattner GetPluginDescriptionStatic()662ace1e57SPavel Labath static llvm::StringRef GetPluginDescriptionStatic() { 672ace1e57SPavel Labath return "ELF object file reader."; 682ace1e57SPavel Labath } 6930fdc8d8SChris Lattner 7030fdc8d8SChris Lattner static lldb_private::ObjectFile * 71c69307e5SJonas Devlieghere CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp, 72b9c1b51eSKate Stone lldb::offset_t data_offset, const lldb_private::FileSpec *file, 73b9c1b51eSKate Stone lldb::offset_t file_offset, lldb::offset_t length); 7430fdc8d8SChris Lattner 75b9c1b51eSKate Stone static lldb_private::ObjectFile *CreateMemoryInstance( 76*f2ea125eSJonas Devlieghere const lldb::ModuleSP &module_sp, lldb::WritableDataBufferSP data_sp, 77b9c1b51eSKate Stone const lldb::ProcessSP &process_sp, lldb::addr_t header_addr); 78c9660546SGreg Clayton 79b9c1b51eSKate Stone static size_t GetModuleSpecifications(const lldb_private::FileSpec &file, 80f4d6de6aSGreg Clayton lldb::DataBufferSP &data_sp, 81f4d6de6aSGreg Clayton lldb::offset_t data_offset, 82f4d6de6aSGreg Clayton lldb::offset_t file_offset, 83f4d6de6aSGreg Clayton lldb::offset_t length, 84f4d6de6aSGreg Clayton lldb_private::ModuleSpecList &specs); 859f0013d8SMichael Sartain 86b9c1b51eSKate Stone static bool MagicBytesMatch(lldb::DataBufferSP &data_sp, lldb::addr_t offset, 879f0013d8SMichael Sartain lldb::addr_t length); 889f0013d8SMichael Sartain 89f325ba9dSStephen Wilson // PluginInterface protocol GetPluginName()902ace1e57SPavel Labath llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 9130fdc8d8SChris Lattner 92e84f7841SPavel Labath // LLVM RTTI support 93e84f7841SPavel Labath static char ID; isA(const void * ClassID)94e84f7841SPavel Labath bool isA(const void *ClassID) const override { 95e84f7841SPavel Labath return ClassID == &ID || ObjectFile::isA(ClassID); 96e84f7841SPavel Labath } classof(const ObjectFile * obj)97e84f7841SPavel Labath static bool classof(const ObjectFile *obj) { return obj->isA(&ID); } 98e84f7841SPavel Labath 99f325ba9dSStephen Wilson // ObjectFile Protocol. 100b9c1b51eSKate Stone bool ParseHeader() override; 10130fdc8d8SChris Lattner 102b9c1b51eSKate Stone bool SetLoadAddress(lldb_private::Target &target, lldb::addr_t value, 1036d06d905SGreg Clayton bool value_is_offset) override; 1049e02dacdSSteve Pucci 105b9c1b51eSKate Stone lldb::ByteOrder GetByteOrder() const override; 10630fdc8d8SChris Lattner 107b9c1b51eSKate Stone bool IsExecutable() const override; 1085aee162fSJim Ingham 109b9c1b51eSKate Stone uint32_t GetAddressByteSize() const override; 11030fdc8d8SChris Lattner 1119e1a117dSTatyana Krasnukha lldb_private::AddressClass GetAddressClass(lldb::addr_t file_addr) override; 112fbd703adSTodd Fiala 1137e6df41fSGreg Clayton void ParseSymtab(lldb_private::Symtab &symtab) override; 11430fdc8d8SChris Lattner 115b9c1b51eSKate Stone bool IsStripped() override; 1163046e668SGreg Clayton 117b9c1b51eSKate Stone void CreateSections(lldb_private::SectionList &unified_section_list) override; 11830fdc8d8SChris Lattner 119b9c1b51eSKate Stone void Dump(lldb_private::Stream *s) override; 12030fdc8d8SChris Lattner 121f760f5aeSPavel Labath lldb_private::ArchSpec GetArchitecture() override; 12230fdc8d8SChris Lattner 123bd334efdSPavel Labath lldb_private::UUID GetUUID() override; 12430fdc8d8SChris Lattner 125bfb261baSPavel Labath /// Return the contents of the .gnu_debuglink section, if the object file 126bfb261baSPavel Labath /// contains it. 127bfb261baSPavel Labath llvm::Optional<lldb_private::FileSpec> GetDebugLink(); 128a7499c98SMichael Sartain 129b9c1b51eSKate Stone uint32_t GetDependentModules(lldb_private::FileSpecList &files) override; 13030fdc8d8SChris Lattner 1316d06d905SGreg Clayton lldb_private::Address 1326d06d905SGreg Clayton GetImageInfoAddress(lldb_private::Target *target) override; 1332ab0a585SStephen Wilson 134b9c1b51eSKate Stone lldb_private::Address GetEntryPointAddress() override; 1359e00b6a6SGreg Clayton 136976af43bSPavel Labath lldb_private::Address GetBaseAddress() override; 137976af43bSPavel Labath 138b9c1b51eSKate Stone ObjectFile::Type CalculateType() override; 1399e00b6a6SGreg Clayton 140b9c1b51eSKate Stone ObjectFile::Strata CalculateStrata() override; 141672e6f59SJim Ingham 142e2867bc4SPavel Labath size_t ReadSectionData(lldb_private::Section *section, 143e2867bc4SPavel Labath lldb::offset_t section_offset, void *dst, 144e2867bc4SPavel Labath size_t dst_len) override; 145e2867bc4SPavel Labath 146e2867bc4SPavel Labath size_t ReadSectionData(lldb_private::Section *section, 147e2867bc4SPavel Labath lldb_private::DataExtractor §ion_data) override; 148e2867bc4SPavel Labath 1495ea7ecdbSPavel Labath llvm::ArrayRef<elf::ELFProgramHeader> ProgramHeaders(); 1505ea7ecdbSPavel Labath lldb_private::DataExtractor GetSegmentData(const elf::ELFProgramHeader &H); 1514822d926SAshok Thirumurthi 1524d35d6b3SPavel Labath llvm::StringRef 153c6ae7eaaSPavel Labath StripLinkerSymbolAnnotations(llvm::StringRef symbol_name) const override; 154c6ae7eaaSPavel Labath 155d13f691fSEd Maste void RelocateSection(lldb_private::Section *section) override; 156d13f691fSEd Maste 15716064d35SPavel Labath protected: 15816064d35SPavel Labath 15916064d35SPavel Labath std::vector<LoadableData> 16016064d35SPavel Labath GetLoadableData(lldb_private::Target &target) override; 16116064d35SPavel Labath 162fc54427eSJonas Devlieghere static lldb::WritableDataBufferSP 163fc54427eSJonas Devlieghere MapFileDataWritable(const lldb_private::FileSpec &file, uint64_t Size, 164fc54427eSJonas Devlieghere uint64_t Offset); 165fc54427eSJonas Devlieghere 166f325ba9dSStephen Wilson private: 167*f2ea125eSJonas Devlieghere ObjectFileELF(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp, 168b9c1b51eSKate Stone lldb::offset_t data_offset, const lldb_private::FileSpec *file, 169b9c1b51eSKate Stone lldb::offset_t offset, lldb::offset_t length); 17030fdc8d8SChris Lattner 17117220c18SAndrew MacPherson ObjectFileELF(const lldb::ModuleSP &module_sp, 172*f2ea125eSJonas Devlieghere lldb::DataBufferSP header_data_sp, 173b9c1b51eSKate Stone const lldb::ProcessSP &process_sp, lldb::addr_t header_addr); 17417220c18SAndrew MacPherson 175f325ba9dSStephen Wilson typedef std::vector<elf::ELFProgramHeader> ProgramHeaderColl; 17630fdc8d8SChris Lattner 177b9c1b51eSKate Stone struct ELFSectionHeaderInfo : public elf::ELFSectionHeader { 178a7499c98SMichael Sartain lldb_private::ConstString section_name; 179a7499c98SMichael Sartain }; 1808157a887SEugene Zelenko 181a7499c98SMichael Sartain typedef std::vector<ELFSectionHeaderInfo> SectionHeaderColl; 18230fdc8d8SChris Lattner typedef SectionHeaderColl::iterator SectionHeaderCollIter; 18330fdc8d8SChris Lattner typedef SectionHeaderColl::const_iterator SectionHeaderCollConstIter; 18430fdc8d8SChris Lattner 185499b40e8SStephen Wilson typedef std::vector<elf::ELFDynamic> DynamicSymbolColl; 186499b40e8SStephen Wilson typedef DynamicSymbolColl::iterator DynamicSymbolCollIter; 187499b40e8SStephen Wilson typedef DynamicSymbolColl::const_iterator DynamicSymbolCollConstIter; 188499b40e8SStephen Wilson 1899e1a117dSTatyana Krasnukha typedef std::map<lldb::addr_t, lldb_private::AddressClass> 190b9c1b51eSKate Stone FileAddressToAddressClassMap; 19183544cf6STamas Berghammer 192f325ba9dSStephen Wilson /// Version of this reader common to all plugins based on this class. 193f325ba9dSStephen Wilson static const uint32_t m_plugin_version = 1; 1944339f3a4STodd Fiala static const uint32_t g_core_uuid_magic; 195f325ba9dSStephen Wilson 196f325ba9dSStephen Wilson /// ELF file header. 197f325ba9dSStephen Wilson elf::ELFHeader m_header; 198f325ba9dSStephen Wilson 199a7499c98SMichael Sartain /// ELF build ID. 200c836ae7dSMichael Sartain lldb_private::UUID m_uuid; 201c836ae7dSMichael Sartain 202a7499c98SMichael Sartain /// ELF .gnu_debuglink file and crc data if available. 203a7499c98SMichael Sartain std::string m_gnu_debuglink_file; 204a3189a03SPavel Labath uint32_t m_gnu_debuglink_crc = 0; 205a7499c98SMichael Sartain 206f325ba9dSStephen Wilson /// Collection of program headers. 20730fdc8d8SChris Lattner ProgramHeaderColl m_program_headers; 208f325ba9dSStephen Wilson 209f325ba9dSStephen Wilson /// Collection of section headers. 21030fdc8d8SChris Lattner SectionHeaderColl m_section_headers; 211f325ba9dSStephen Wilson 212499b40e8SStephen Wilson /// Collection of symbols from the dynamic table. 213499b40e8SStephen Wilson DynamicSymbolColl m_dynamic_symbols; 214499b40e8SStephen Wilson 2152c082b48SKonrad Kleine /// Object file parsed from .gnu_debugdata section (\sa 2162c082b48SKonrad Kleine /// GetGnuDebugDataObjectFile()) 2172c082b48SKonrad Kleine std::shared_ptr<ObjectFileELF> m_gnu_debug_data_object_file; 2182c082b48SKonrad Kleine 219f325ba9dSStephen Wilson /// List of file specifications corresponding to the modules (shared 220f325ba9dSStephen Wilson /// libraries) on which this object file depends. 221d5b44036SJonas Devlieghere mutable std::unique_ptr<lldb_private::FileSpecList> m_filespec_up; 222f325ba9dSStephen Wilson 223672e6f59SJim Ingham /// Cached value of the entry point for this module. 224672e6f59SJim Ingham lldb_private::Address m_entry_point_address; 225672e6f59SJim Ingham 226b91de786STodd Fiala /// The architecture detected from parsing elf file contents. 227b91de786STodd Fiala lldb_private::ArchSpec m_arch_spec; 228b91de786STodd Fiala 22983544cf6STamas Berghammer /// The address class for each symbol in the elf file 23083544cf6STamas Berghammer FileAddressToAddressClassMap m_address_class_map; 23183544cf6STamas Berghammer 2320d38e4fdSPavel Labath /// Returns the index of the given section header. 233b9c1b51eSKate Stone size_t SectionIndex(const SectionHeaderCollIter &I); 234f325ba9dSStephen Wilson 2350d38e4fdSPavel Labath /// Returns the index of the given section header. 236b9c1b51eSKate Stone size_t SectionIndex(const SectionHeaderCollConstIter &I) const; 237f325ba9dSStephen Wilson 2384339f3a4STodd Fiala // Parses the ELF program headers. 239b9c1b51eSKate Stone static size_t GetProgramHeaderInfo(ProgramHeaderColl &program_headers, 240df1a0d11SPavel Labath lldb_private::DataExtractor &object_data, 2414339f3a4STodd Fiala const elf::ELFHeader &header); 2424339f3a4STodd Fiala 2434339f3a4STodd Fiala // Finds PT_NOTE segments and calculates their crc sum. 2444339f3a4STodd Fiala static uint32_t 2454339f3a4STodd Fiala CalculateELFNotesSegmentsCRC32(const ProgramHeaderColl &program_headers, 2464339f3a4STodd Fiala lldb_private::DataExtractor &data); 2474339f3a4STodd Fiala 248f325ba9dSStephen Wilson /// Parses all section headers present in this object file and populates 249f325ba9dSStephen Wilson /// m_program_headers. This method will compute the header list only once. 2505ea7ecdbSPavel Labath /// Returns true iff the headers have been successfully parsed. 2515ea7ecdbSPavel Labath bool ParseProgramHeaders(); 25230fdc8d8SChris Lattner 253f325ba9dSStephen Wilson /// Parses all section headers present in this object file and populates 254f325ba9dSStephen Wilson /// m_section_headers. This method will compute the header list only once. 255f325ba9dSStephen Wilson /// Returns the number of headers parsed. 256b9c1b51eSKate Stone size_t ParseSectionHeaders(); 25730fdc8d8SChris Lattner 25862a8254fSPavel Labath lldb::SectionType GetSectionType(const ELFSectionHeaderInfo &H) const; 25962a8254fSPavel Labath 260b9c1b51eSKate Stone static void ParseARMAttributes(lldb_private::DataExtractor &data, 261b9c1b51eSKate Stone uint64_t length, 262d2d15048SSaleem Abdulrasool lldb_private::ArchSpec &arch_spec); 263d2d15048SSaleem Abdulrasool 264d8f460e8SAdrian Prantl /// Parses the elf section headers and returns the uuid, debug link name, 265d8f460e8SAdrian Prantl /// crc, archspec. 266b9c1b51eSKate Stone static size_t GetSectionHeaderInfo(SectionHeaderColl §ion_headers, 267df1a0d11SPavel Labath lldb_private::DataExtractor &object_data, 268a7499c98SMichael Sartain const elf::ELFHeader &header, 269a7499c98SMichael Sartain lldb_private::UUID &uuid, 270a7499c98SMichael Sartain std::string &gnu_debuglink_file, 271b91de786STodd Fiala uint32_t &gnu_debuglink_crc, 272b91de786STodd Fiala lldb_private::ArchSpec &arch_spec); 273a7499c98SMichael Sartain 274f325ba9dSStephen Wilson /// Scans the dynamic section and locates all dependent modules (shared 275d5b44036SJonas Devlieghere /// libraries) populating m_filespec_up. This method will compute the 276f325ba9dSStephen Wilson /// dependent module list only once. Returns the number of dependent 277f325ba9dSStephen Wilson /// modules parsed. 278b9c1b51eSKate Stone size_t ParseDependentModules(); 27930fdc8d8SChris Lattner 280499b40e8SStephen Wilson /// Parses the dynamic symbol table and populates m_dynamic_symbols. The 281499b40e8SStephen Wilson /// vector retains the order as found in the object file. Returns the 282499b40e8SStephen Wilson /// number of dynamic symbols parsed. 283b9c1b51eSKate Stone size_t ParseDynamicSymbols(); 284499b40e8SStephen Wilson 2857e6df41fSGreg Clayton /// Populates the symbol table with all non-dynamic linker symbols. This 2867e6df41fSGreg Clayton /// method will parse the symbols only once. Returns the number of symbols 2877e6df41fSGreg Clayton /// parsed. 288b9c1b51eSKate Stone unsigned ParseSymbolTable(lldb_private::Symtab *symbol_table, 289499b40e8SStephen Wilson lldb::user_id_t start_id, 2903046e668SGreg Clayton lldb_private::Section *symtab); 291f325ba9dSStephen Wilson 292a7499c98SMichael Sartain /// Helper routine for ParseSymbolTable(). 293b9c1b51eSKate Stone unsigned ParseSymbols(lldb_private::Symtab *symbol_table, 294a7499c98SMichael Sartain lldb::user_id_t start_id, 295a7499c98SMichael Sartain lldb_private::SectionList *section_list, 2963046e668SGreg Clayton const size_t num_symbols, 297a7499c98SMichael Sartain const lldb_private::DataExtractor &symtab_data, 298a7499c98SMichael Sartain const lldb_private::DataExtractor &strtab_data); 299a7499c98SMichael Sartain 300499b40e8SStephen Wilson /// Scans the relocation entries and adds a set of artificial symbols to the 301499b40e8SStephen Wilson /// given symbol table for each PLT slot. Returns the number of symbols 302499b40e8SStephen Wilson /// added. 303b9c1b51eSKate Stone unsigned ParseTrampolineSymbols(lldb_private::Symtab *symbol_table, 304499b40e8SStephen Wilson lldb::user_id_t start_id, 305a7499c98SMichael Sartain const ELFSectionHeaderInfo *rela_hdr, 306499b40e8SStephen Wilson lldb::user_id_t section_id); 307499b40e8SStephen Wilson 308b9c1b51eSKate Stone void ParseUnwindSymbols(lldb_private::Symtab *symbol_table, 3096b63b148STamas Berghammer lldb_private::DWARFCallFrameInfo *eh_frame); 3106b63b148STamas Berghammer 31117220c18SAndrew MacPherson /// Relocates debug sections 312b9c1b51eSKate Stone unsigned RelocateDebugSections(const elf::ELFSectionHeader *rel_hdr, 313d13f691fSEd Maste lldb::user_id_t rel_id, 314d13f691fSEd Maste lldb_private::Symtab *thetab); 31517220c18SAndrew MacPherson 316d13f691fSEd Maste unsigned ApplyRelocations(lldb_private::Symtab *symtab, 317b9c1b51eSKate Stone const elf::ELFHeader *hdr, 318b9c1b51eSKate Stone const elf::ELFSectionHeader *rel_hdr, 319b9c1b51eSKate Stone const elf::ELFSectionHeader *symtab_hdr, 320b9c1b51eSKate Stone const elf::ELFSectionHeader *debug_hdr, 321b9c1b51eSKate Stone lldb_private::DataExtractor &rel_data, 322b9c1b51eSKate Stone lldb_private::DataExtractor &symtab_data, 323b9c1b51eSKate Stone lldb_private::DataExtractor &debug_data, 324b9c1b51eSKate Stone lldb_private::Section *rel_section); 32517220c18SAndrew MacPherson 32617220c18SAndrew MacPherson /// Loads the section name string table into m_shstr_data. Returns the 32717220c18SAndrew MacPherson /// number of bytes constituting the table. 328b9c1b51eSKate Stone size_t GetSectionHeaderStringTable(); 32917220c18SAndrew MacPherson 33017220c18SAndrew MacPherson /// Utility method for looking up a section given its name. Returns the 33117220c18SAndrew MacPherson /// index of the corresponding section or zero if no section with the given 33217220c18SAndrew MacPherson /// name can be found (note that section indices are always 1 based, and so 33317220c18SAndrew MacPherson /// section index 0 is never valid). 334b9c1b51eSKate Stone lldb::user_id_t GetSectionIndexByName(const char *name); 33517220c18SAndrew MacPherson 336499b40e8SStephen Wilson /// Returns the section header with the given id or NULL. 337b9c1b51eSKate Stone const ELFSectionHeaderInfo *GetSectionHeaderByIndex(lldb::user_id_t id); 338499b40e8SStephen Wilson 339f05b42e9SAdrian Prantl /// \name ELF header dump routines 340f325ba9dSStephen Wilson //@{ 341b9c1b51eSKate Stone static void DumpELFHeader(lldb_private::Stream *s, 342b9c1b51eSKate Stone const elf::ELFHeader &header); 34330fdc8d8SChris Lattner 344b9c1b51eSKate Stone static void DumpELFHeader_e_ident_EI_DATA(lldb_private::Stream *s, 345f325ba9dSStephen Wilson unsigned char ei_data); 34630fdc8d8SChris Lattner 347b9c1b51eSKate Stone static void DumpELFHeader_e_type(lldb_private::Stream *s, 348b9c1b51eSKate Stone elf::elf_half e_type); 349f325ba9dSStephen Wilson //@} 350f325ba9dSStephen Wilson 351f05b42e9SAdrian Prantl /// \name ELF program header dump routines 352f325ba9dSStephen Wilson //@{ 353b9c1b51eSKate Stone void DumpELFProgramHeaders(lldb_private::Stream *s); 35430fdc8d8SChris Lattner 355b9c1b51eSKate Stone static void DumpELFProgramHeader(lldb_private::Stream *s, 356f325ba9dSStephen Wilson const elf::ELFProgramHeader &ph); 35730fdc8d8SChris Lattner 358b9c1b51eSKate Stone static void DumpELFProgramHeader_p_type(lldb_private::Stream *s, 359b9c1b51eSKate Stone elf::elf_word p_type); 36030fdc8d8SChris Lattner 361b9c1b51eSKate Stone static void DumpELFProgramHeader_p_flags(lldb_private::Stream *s, 362f325ba9dSStephen Wilson elf::elf_word p_flags); 363f325ba9dSStephen Wilson //@} 36430fdc8d8SChris Lattner 365f05b42e9SAdrian Prantl /// \name ELF section header dump routines 366f325ba9dSStephen Wilson //@{ 367b9c1b51eSKate Stone void DumpELFSectionHeaders(lldb_private::Stream *s); 36830fdc8d8SChris Lattner 369b9c1b51eSKate Stone static void DumpELFSectionHeader(lldb_private::Stream *s, 370a7499c98SMichael Sartain const ELFSectionHeaderInfo &sh); 37130fdc8d8SChris Lattner 372b9c1b51eSKate Stone static void DumpELFSectionHeader_sh_type(lldb_private::Stream *s, 373f325ba9dSStephen Wilson elf::elf_word sh_type); 37430fdc8d8SChris Lattner 375b9c1b51eSKate Stone static void DumpELFSectionHeader_sh_flags(lldb_private::Stream *s, 376c7bece56SGreg Clayton elf::elf_xword sh_flags); 377f325ba9dSStephen Wilson //@} 37830fdc8d8SChris Lattner 379f325ba9dSStephen Wilson /// ELF dependent module dump routine. 380b9c1b51eSKate Stone void DumpDependentModules(lldb_private::Stream *s); 38130fdc8d8SChris Lattner 382b9c1b51eSKate Stone const elf::ELFDynamic *FindDynamicSymbol(unsigned tag); 383499b40e8SStephen Wilson 384b9c1b51eSKate Stone unsigned PLTRelocationType(); 385b91de786STodd Fiala 38697206d57SZachary Turner static lldb_private::Status 387b9c1b51eSKate Stone RefineModuleDetailsFromNote(lldb_private::DataExtractor &data, 388b9c1b51eSKate Stone lldb_private::ArchSpec &arch_spec, 389b9c1b51eSKate Stone lldb_private::UUID &uuid); 39016064d35SPavel Labath 39116064d35SPavel Labath bool AnySegmentHasPhysicalAddress(); 3922c082b48SKonrad Kleine 3932c082b48SKonrad Kleine /// Takes the .gnu_debugdata and returns the decompressed object file that is 3942c082b48SKonrad Kleine /// stored within that section. 3952c082b48SKonrad Kleine /// 3962c082b48SKonrad Kleine /// \returns either the decompressed object file stored within the 3972c082b48SKonrad Kleine /// .gnu_debugdata section or \c nullptr if an error occured or if there's no 3982c082b48SKonrad Kleine /// section with that name. 3992c082b48SKonrad Kleine std::shared_ptr<ObjectFileELF> GetGnuDebugDataObjectFile(); 40030fdc8d8SChris Lattner }; 40130fdc8d8SChris Lattner 402cdc514e4SJonas Devlieghere #endif // LLDB_SOURCE_PLUGINS_OBJECTFILE_ELF_OBJECTFILEELF_H 403