1ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//===-- ELFHeader.h ------------------------------------------- -*- C++ -*-===// 2ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson// 3ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson// The LLVM Compiler Infrastructure 4ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson// 5ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson// This file is distributed under the University of Illinois Open Source 6ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson// License. See LICENSE.TXT for details. 7ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson// 8ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//===----------------------------------------------------------------------===// 9ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson// 10ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// @file 11ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// @brief Generic structures and typedefs for ELF files. 12ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// 13ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// This file provides definitions for the various entities comprising an ELF 14ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// file. The structures are generic in the sense that they do not correspond 15ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// to the exact binary layout of an ELF, but can be used to hold the 16ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// information present in both 32 and 64 bit variants of the format. Each 17ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// entity provides a \c Parse method which is capable of transparently reading 18ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// both 32 and 64 bit instances of the object. 19ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//===----------------------------------------------------------------------===// 20ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 21ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson#ifndef liblldb_ELFHeader_h_ 22ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson#define liblldb_ELFHeader_h_ 23ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 24ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson#include "llvm/Support/ELF.h" 25ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 26ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson#include "lldb/lldb-enumerations.h" 27ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 28ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonnamespace lldb_private 29ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{ 30ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonclass DataExtractor; 31ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson} // End namespace lldb_private. 32ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 33ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonnamespace elf 34ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{ 35ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 36ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//------------------------------------------------------------------------------ 37ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// @name ELF type definitions. 38ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// 39ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// Types used to represent the various components of ELF structures. All types 40ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// are signed or unsigned integral types wide enough to hold values from both 41ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// 32 and 64 bit ELF variants. 42ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//@{ 43ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsontypedef uint64_t elf_addr; 44ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsontypedef uint64_t elf_off; 45ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsontypedef uint16_t elf_half; 46ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsontypedef uint32_t elf_word; 47ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsontypedef int32_t elf_sword; 48ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsontypedef uint64_t elf_size; 49ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsontypedef uint64_t elf_xword; 50ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsontypedef int64_t elf_sxword; 51ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//@} 52ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 53ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//------------------------------------------------------------------------------ 54ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// @class ELFHeader 55ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// @brief Generic representation of an ELF file header. 56ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// 57ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// This object is used to identify the general attributes on an ELF file and to 58ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// locate additional sections within the file. 59ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonstruct ELFHeader 60ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{ 61ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson unsigned char e_ident[llvm::ELF::EI_NIDENT]; ///< ELF file identification. 62ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_addr e_entry; ///< Virtual address program entry point. 63ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_off e_phoff; ///< File offset of program header table. 64ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_off e_shoff; ///< File offset of section header table. 65ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_word e_flags; ///< Processor specific flags. 66ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_word e_version; ///< Version of object file (always 1). 67ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_half e_type; ///< Object file type. 68ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_half e_machine; ///< Target architecture. 69ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_half e_ehsize; ///< Byte size of the ELF header. 70ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_half e_phentsize; ///< Size of a program header table entry. 715d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton elf_half e_phnum; ///< Number of program header entries. 72ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_half e_shentsize; ///< Size of a section header table entry. 735d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton elf_half e_shnum; ///< Number of section header entries. 74ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_half e_shstrndx; ///< String table section index. 75ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 76ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson ELFHeader(); 77ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 78ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson //-------------------------------------------------------------------------- 79ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// Returns true if this is a 32 bit ELF file header. 80ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// 81ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// @return 82ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// True if this is a 32 bit ELF file header. 83ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson bool Is32Bit() const { 84ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson return e_ident[llvm::ELF::EI_CLASS] == llvm::ELF::ELFCLASS32; 85ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson } 86ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 87ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson //-------------------------------------------------------------------------- 88ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// Returns true if this is a 64 bit ELF file header. 89ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// 90ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// @return 91ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// True if this is a 64 bit ELF file header. 92ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson bool Is64Bit() const { 93ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson return e_ident[llvm::ELF::EI_CLASS] == llvm::ELF::ELFCLASS64; 94ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson } 95ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 96ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson //-------------------------------------------------------------------------- 97ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// The byte order of this ELF file header. 98ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// 99ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// @return 100ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// The byte order of this ELF file as described by the header. 101ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson lldb::ByteOrder 102ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson GetByteOrder() const; 103ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 104ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson //-------------------------------------------------------------------------- 1059b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// The jump slot relocation type of this ELF. 1069b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson unsigned 1079b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson GetRelocationJumpSlotType() const; 1089b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson 1099b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson //-------------------------------------------------------------------------- 1100be9b3b58e6ba0929b325c4520d388aafed5891fMichael Sartain /// Parse an ELFHeader entry starting at position \p offset and 111ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// update the data extractor with the address size and byte order 112ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// attributes as defined by the header. 113ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// 114ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// @param[in,out] data 115ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// The DataExtractor to read from. Updated with the address size and 116ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// byte order attributes appropriate to this header. 117ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// 118ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// @param[in,out] offset 119ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// Pointer to an offset in the data. On return the offset will be 120ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// advanced by the number of bytes read. 121ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// 122ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// @return 1230be9b3b58e6ba0929b325c4520d388aafed5891fMichael Sartain /// True if the ELFHeader was successfully read and false 124ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// otherwise. 125ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson bool 12636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton Parse(lldb_private::DataExtractor &data, lldb::offset_t *offset); 127ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 128ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson //-------------------------------------------------------------------------- 129ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// Examines at most EI_NIDENT bytes starting from the given pointer and 130ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// determines if the magic ELF identification exists. 131ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// 132ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// @return 133ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// True if the given sequence of bytes identifies an ELF file. 134ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson static bool 135ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson MagicBytesMatch(const uint8_t *magic); 136ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 137ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson //-------------------------------------------------------------------------- 138ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// Examines at most EI_NIDENT bytes starting from the given address and 139ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// determines the address size of the underlying ELF file. This function 140ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// should only be called on an pointer for which MagicBytesMatch returns 141ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// true. 142ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// 143ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// @return 144ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// The number of bytes forming an address in the ELF file (either 4 or 145ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// 8), else zero if the address size could not be determined. 146ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson static unsigned 147ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson AddressSizeInBytes(const uint8_t *magic); 148ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson}; 149ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 150ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//------------------------------------------------------------------------------ 151ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// @class ELFSectionHeader 152ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// @brief Generic representation of an ELF section header. 153ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonstruct ELFSectionHeader 154ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{ 155ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_word sh_name; ///< Section name string index. 156ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_word sh_type; ///< Section type. 157ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_xword sh_flags; ///< Section attributes. 158ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_addr sh_addr; ///< Virtual address of the section in memory. 159ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_off sh_offset; ///< Start of section from beginning of file. 160ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_xword sh_size; ///< Number of bytes occupied in the file. 161ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_word sh_link; ///< Index of associated section. 162ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_word sh_info; ///< Extra section info (overloaded). 163ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_xword sh_addralign; ///< Power of two alignment constraint. 164ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_xword sh_entsize; ///< Byte size of each section entry. 165ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 166ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson ELFSectionHeader(); 167ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 168ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson //-------------------------------------------------------------------------- 169ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// Parse an ELFSectionHeader entry from the given DataExtracter starting at 170ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// position \p offset. 171ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// 172ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// @param[in] data 173ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// The DataExtractor to read from. The address size of the extractor 174ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// determines if a 32 or 64 bit object should be read. 175ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// 176ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// @param[in,out] offset 177ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// Pointer to an offset in the data. On return the offset will be 178ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// advanced by the number of bytes read. 179ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// 180ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// @return 181ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// True if the ELFSectionHeader was successfully read and false 182ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// otherwise. 183ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson bool 18436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset); 185ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson}; 186ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 187ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//------------------------------------------------------------------------------ 188ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// @class ELFProgramHeader 189ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// @brief Generic representation of an ELF program header. 190ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonstruct ELFProgramHeader 191ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{ 1925d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton elf_word p_type; ///< Type of program segment. 1935d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton elf_word p_flags; ///< Segment attributes. 1945d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton elf_off p_offset; ///< Start of segment from beginning of file. 195ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_addr p_vaddr; ///< Virtual address of segment in memory. 196ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_addr p_paddr; ///< Physical address (for non-VM systems). 197ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_xword p_filesz; ///< Byte size of the segment in file. 198ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_xword p_memsz; ///< Byte size of the segment in memory. 1995d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton elf_xword p_align; ///< Segment alignment constraint. 200ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 201ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson ELFProgramHeader(); 202ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 2035d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton /// Parse an ELFProgramHeader entry from the given DataExtractor starting at 2045d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton /// position \p offset. The address size of the DataExtractor determines if 205ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// a 32 or 64 bit object is to be parsed. 206ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// 207ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// @param[in] data 208ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// The DataExtractor to read from. The address size of the extractor 209ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// determines if a 32 or 64 bit object should be read. 210ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// 211ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// @param[in,out] offset 212ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// Pointer to an offset in the data. On return the offset will be 213ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// advanced by the number of bytes read. 214ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// 215ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// @return 216ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// True if the ELFProgramHeader was successfully read and false 217ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// otherwise. 218ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson bool 21936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset); 220ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson}; 221ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 222ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//------------------------------------------------------------------------------ 223ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// @class ELFSymbol 224ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// @brief Represents a symbol within an ELF symbol table. 225ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonstruct ELFSymbol 226ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{ 227ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_addr st_value; ///< Absolute or relocatable address. 228ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_xword st_size; ///< Size of the symbol or zero. 229ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_word st_name; ///< Symbol name string index. 230ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson unsigned char st_info; ///< Symbol type and binding attributes. 231ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson unsigned char st_other; ///< Reserved for future use. 232ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_half st_shndx; ///< Section to which this symbol applies. 233ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 234ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson ELFSymbol(); 235ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 236ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// Returns the binding attribute of the st_info member. 237ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson unsigned char getBinding() const { return st_info >> 4; } 238ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 239ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// Returns the type attribute of the st_info member. 240ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson unsigned char getType() const { return st_info & 0x0F; } 241ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 2425d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton /// Sets the binding and type of the st_info member. 243ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson void setBindingAndType(unsigned char binding, unsigned char type) { 244ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson st_info = (binding << 4) + (type & 0x0F); 245ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson } 246ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 247f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton static const char * 248f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton bindingToCString(unsigned char binding); 249f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton 250f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton static const char * 251f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton typeToCString(unsigned char type); 252f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton 253f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton static const char * 254f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton sectionIndexToCString(elf_half shndx, 255f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton const lldb_private::SectionList *section_list); 256f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton 2575d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton /// Parse an ELFSymbol entry from the given DataExtractor starting at 2585d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton /// position \p offset. The address size of the DataExtractor determines if 259ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// a 32 or 64 bit object is to be parsed. 260ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// 261ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// @param[in] data 262ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// The DataExtractor to read from. The address size of the extractor 263ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// determines if a 32 or 64 bit object should be read. 264ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// 265ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// @param[in,out] offset 266ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// Pointer to an offset in the data. On return the offset will be 267ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// advanced by the number of bytes read. 268ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// 269ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// @return 270ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// True if the ELFSymbol was successfully read and false otherwise. 271ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson bool 27236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset); 273f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton 274f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton void 275f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton Dump (lldb_private::Stream *s, 276f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton uint32_t idx, 277f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton const lldb_private::DataExtractor *strtab_data, 278f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton const lldb_private::SectionList *section_list); 279ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson}; 280ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 281ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//------------------------------------------------------------------------------ 282ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// @class ELFDynamic 283ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson/// @brief Represents an entry in an ELF dynamic table. 284ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonstruct ELFDynamic 285ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{ 286ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_sxword d_tag; ///< Type of dynamic table entry. 287ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson union 288ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson { 289ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_xword d_val; ///< Integer value of the table entry. 290ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson elf_addr d_ptr; ///< Pointer value of the table entry. 291ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson }; 292ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 293ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson ELFDynamic(); 294ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 2955d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton /// Parse an ELFDynamic entry from the given DataExtractor starting at 2965d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton /// position \p offset. The address size of the DataExtractor determines if 297ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// a 32 or 64 bit object is to be parsed. 298ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// 299ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// @param[in] data 300ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// The DataExtractor to read from. The address size of the extractor 301ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// determines if a 32 or 64 bit object should be read. 302ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// 303ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// @param[in,out] offset 304ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// Pointer to an offset in the data. On return the offset will be 305ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// advanced by the number of bytes read. 306ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// 307ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// @return 308ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// True if the ELFDynamic entry was successfully read and false 309ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson /// otherwise. 310ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson bool 31136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset); 312ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson}; 313ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 3149b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson//------------------------------------------------------------------------------ 3159b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson/// @class ELFRel 3169b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson/// @brief Represents a relocation entry with an implicit addend. 3179b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilsonstruct ELFRel 3189b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson{ 3199b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson elf_addr r_offset; ///< Address of reference. 3209b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson elf_xword r_info; ///< symbol index and type of relocation. 3219b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson 3229b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson ELFRel(); 3239b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson 3249b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// Parse an ELFRel entry from the given DataExtractor starting at position 3259b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// \p offset. The address size of the DataExtractor determines if a 32 or 3269b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// 64 bit object is to be parsed. 3279b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// 3289b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// @param[in] data 3299b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// The DataExtractor to read from. The address size of the extractor 3309b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// determines if a 32 or 64 bit object should be read. 3319b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// 3329b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// @param[in,out] offset 3339b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// Pointer to an offset in the data. On return the offset will be 3349b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// advanced by the number of bytes read. 3359b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// 3369b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// @return 3379b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// True if the ELFRel entry was successfully read and false otherwise. 3389b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson bool 33936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset); 3409b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson 3419b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// Returns the type when the given entry represents a 32-bit relocation. 3429b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson static unsigned 3439b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson RelocType32(const ELFRel &rel) 3449b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson { 3459b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson return rel.r_info & 0x0ff; 3469b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson } 3479b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson 3489b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// Returns the type when the given entry represents a 64-bit relocation. 3499b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson static unsigned 3509b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson RelocType64(const ELFRel &rel) 3519b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson { 3529b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson return rel.r_info & 0xffffffff; 3539b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson } 3549b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson 3559b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// Returns the symbol index when the given entry represents a 32-bit 3569b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// reloction. 3579b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson static unsigned 3589b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson RelocSymbol32(const ELFRel &rel) 3599b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson { 3609b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson return rel.r_info >> 8; 3619b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson } 3629b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson 3639b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// Returns the symbol index when the given entry represents a 64-bit 3649b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// reloction. 3659b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson static unsigned 3669b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson RelocSymbol64(const ELFRel &rel) 3679b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson { 3689b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson return rel.r_info >> 32; 3699b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson } 3709b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson}; 3719b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson 3729b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson//------------------------------------------------------------------------------ 3739b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson/// @class ELFRela 3749b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson/// @brief Represents a relocation entry with an explicit addend. 3759b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilsonstruct ELFRela 3769b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson{ 3779b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson elf_addr r_offset; ///< Address of reference. 3789b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson elf_xword r_info; ///< Symbol index and type of relocation. 3799b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson elf_sxword r_addend; ///< Constant part of expression. 3809b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson 3819b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson ELFRela(); 3829b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson 3839b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// Parse an ELFRela entry from the given DataExtractor starting at position 3849b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// \p offset. The address size of the DataExtractor determines if a 32 or 3859b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// 64 bit object is to be parsed. 3869b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// 3879b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// @param[in] data 3889b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// The DataExtractor to read from. The address size of the extractor 3899b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// determines if a 32 or 64 bit object should be read. 3909b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// 3919b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// @param[in,out] offset 3929b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// Pointer to an offset in the data. On return the offset will be 3939b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// advanced by the number of bytes read. 3949b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// 3959b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// @return 3969b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// True if the ELFRela entry was successfully read and false otherwise. 3979b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson bool 39836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset); 3999b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson 4009b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// Returns the type when the given entry represents a 32-bit relocation. 4019b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson static unsigned 4029b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson RelocType32(const ELFRela &rela) 4039b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson { 4049b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson return rela.r_info & 0x0ff; 4059b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson } 4069b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson 4079b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// Returns the type when the given entry represents a 64-bit relocation. 4089b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson static unsigned 4099b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson RelocType64(const ELFRela &rela) 4109b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson { 4119b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson return rela.r_info & 0xffffffff; 4129b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson } 4139b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson 4149b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// Returns the symbol index when the given entry represents a 32-bit 4159b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// reloction. 4169b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson static unsigned 4179b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson RelocSymbol32(const ELFRela &rela) 4189b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson { 4199b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson return rela.r_info >> 8; 4209b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson } 4219b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson 4229b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// Returns the symbol index when the given entry represents a 64-bit 4239b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson /// reloction. 4249b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson static unsigned 4259b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson RelocSymbol64(const ELFRela &rela) 4269b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson { 4279b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson return rela.r_info >> 32; 4289b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson } 4299b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson}; 4309b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson 431ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson} // End namespace elf. 432ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 433ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson#endif // #ifndef liblldb_ELFHeader_h_ 434