1f325ba9dSStephen Wilson //===-- ELFHeader.h ------------------------------------------- -*- C++ -*-===// 2f325ba9dSStephen Wilson // 3f325ba9dSStephen Wilson // The LLVM Compiler Infrastructure 4f325ba9dSStephen Wilson // 5f325ba9dSStephen Wilson // This file is distributed under the University of Illinois Open Source 6f325ba9dSStephen Wilson // License. See LICENSE.TXT for details. 7f325ba9dSStephen Wilson // 8f325ba9dSStephen Wilson //===----------------------------------------------------------------------===// 9f325ba9dSStephen Wilson // 10f325ba9dSStephen Wilson /// @file 11f325ba9dSStephen Wilson /// @brief Generic structures and typedefs for ELF files. 12f325ba9dSStephen Wilson /// 13f325ba9dSStephen Wilson /// This file provides definitions for the various entities comprising an ELF 14f325ba9dSStephen Wilson /// file. The structures are generic in the sense that they do not correspond 15f325ba9dSStephen Wilson /// to the exact binary layout of an ELF, but can be used to hold the 16f325ba9dSStephen Wilson /// information present in both 32 and 64 bit variants of the format. Each 17f325ba9dSStephen Wilson /// entity provides a \c Parse method which is capable of transparently reading 18f325ba9dSStephen Wilson /// both 32 and 64 bit instances of the object. 19f325ba9dSStephen Wilson //===----------------------------------------------------------------------===// 20f325ba9dSStephen Wilson 21f325ba9dSStephen Wilson #ifndef liblldb_ELFHeader_h_ 22f325ba9dSStephen Wilson #define liblldb_ELFHeader_h_ 23f325ba9dSStephen Wilson 24f325ba9dSStephen Wilson #include "llvm/Support/ELF.h" 25f325ba9dSStephen Wilson 26f325ba9dSStephen Wilson #include "lldb/lldb-enumerations.h" 27f325ba9dSStephen Wilson 28f325ba9dSStephen Wilson namespace lldb_private 29f325ba9dSStephen Wilson { 30f325ba9dSStephen Wilson class DataExtractor; 31f325ba9dSStephen Wilson } // End namespace lldb_private. 32f325ba9dSStephen Wilson 33f325ba9dSStephen Wilson namespace elf 34f325ba9dSStephen Wilson { 35f325ba9dSStephen Wilson 36f325ba9dSStephen Wilson //------------------------------------------------------------------------------ 37f325ba9dSStephen Wilson /// @name ELF type definitions. 38f325ba9dSStephen Wilson /// 39f325ba9dSStephen Wilson /// Types used to represent the various components of ELF structures. All types 40f325ba9dSStephen Wilson /// are signed or unsigned integral types wide enough to hold values from both 41f325ba9dSStephen Wilson /// 32 and 64 bit ELF variants. 42f325ba9dSStephen Wilson //@{ 43f325ba9dSStephen Wilson typedef uint64_t elf_addr; 44f325ba9dSStephen Wilson typedef uint64_t elf_off; 45f325ba9dSStephen Wilson typedef uint16_t elf_half; 46f325ba9dSStephen Wilson typedef uint32_t elf_word; 47f325ba9dSStephen Wilson typedef int32_t elf_sword; 48f325ba9dSStephen Wilson typedef uint64_t elf_size; 49f325ba9dSStephen Wilson typedef uint64_t elf_xword; 50f325ba9dSStephen Wilson typedef int64_t elf_sxword; 51f325ba9dSStephen Wilson //@} 52f325ba9dSStephen Wilson 53f325ba9dSStephen Wilson //------------------------------------------------------------------------------ 54f325ba9dSStephen Wilson /// @class ELFHeader 55f325ba9dSStephen Wilson /// @brief Generic representation of an ELF file header. 56f325ba9dSStephen Wilson /// 57f325ba9dSStephen Wilson /// This object is used to identify the general attributes on an ELF file and to 58f325ba9dSStephen Wilson /// locate additional sections within the file. 59f325ba9dSStephen Wilson struct ELFHeader 60f325ba9dSStephen Wilson { 61f325ba9dSStephen Wilson unsigned char e_ident[llvm::ELF::EI_NIDENT]; ///< ELF file identification. 62f325ba9dSStephen Wilson elf_addr e_entry; ///< Virtual address program entry point. 63f325ba9dSStephen Wilson elf_off e_phoff; ///< File offset of program header table. 64f325ba9dSStephen Wilson elf_off e_shoff; ///< File offset of section header table. 65f325ba9dSStephen Wilson elf_word e_flags; ///< Processor specific flags. 66f325ba9dSStephen Wilson elf_word e_version; ///< Version of object file (always 1). 67f325ba9dSStephen Wilson elf_half e_type; ///< Object file type. 68f325ba9dSStephen Wilson elf_half e_machine; ///< Target architecture. 69f325ba9dSStephen Wilson elf_half e_ehsize; ///< Byte size of the ELF header. 70f325ba9dSStephen Wilson elf_half e_phentsize; ///< Size of a program header table entry. 71*710dd5aeSGreg Clayton elf_half e_phnum; ///< Number of program header entries. 72f325ba9dSStephen Wilson elf_half e_shentsize; ///< Size of a section header table entry. 73*710dd5aeSGreg Clayton elf_half e_shnum; ///< Number of section header entries. 74f325ba9dSStephen Wilson elf_half e_shstrndx; ///< String table section index. 75f325ba9dSStephen Wilson 76f325ba9dSStephen Wilson ELFHeader(); 77f325ba9dSStephen Wilson 78f325ba9dSStephen Wilson //-------------------------------------------------------------------------- 79f325ba9dSStephen Wilson /// Returns true if this is a 32 bit ELF file header. 80f325ba9dSStephen Wilson /// 81f325ba9dSStephen Wilson /// @return 82f325ba9dSStephen Wilson /// True if this is a 32 bit ELF file header. 83f325ba9dSStephen Wilson bool Is32Bit() const { 84f325ba9dSStephen Wilson return e_ident[llvm::ELF::EI_CLASS] == llvm::ELF::ELFCLASS32; 85f325ba9dSStephen Wilson } 86f325ba9dSStephen Wilson 87f325ba9dSStephen Wilson //-------------------------------------------------------------------------- 88f325ba9dSStephen Wilson /// Returns true if this is a 64 bit ELF file header. 89f325ba9dSStephen Wilson /// 90f325ba9dSStephen Wilson /// @return 91f325ba9dSStephen Wilson /// True if this is a 64 bit ELF file header. 92f325ba9dSStephen Wilson bool Is64Bit() const { 93f325ba9dSStephen Wilson return e_ident[llvm::ELF::EI_CLASS] == llvm::ELF::ELFCLASS64; 94f325ba9dSStephen Wilson } 95f325ba9dSStephen Wilson 96f325ba9dSStephen Wilson //-------------------------------------------------------------------------- 97f325ba9dSStephen Wilson /// The byte order of this ELF file header. 98f325ba9dSStephen Wilson /// 99f325ba9dSStephen Wilson /// @return 100f325ba9dSStephen Wilson /// The byte order of this ELF file as described by the header. 101f325ba9dSStephen Wilson lldb::ByteOrder 102f325ba9dSStephen Wilson GetByteOrder() const; 103f325ba9dSStephen Wilson 104f325ba9dSStephen Wilson //-------------------------------------------------------------------------- 105f325ba9dSStephen Wilson /// Parse an ELFSectionHeader entry starting at position \p offset and 106f325ba9dSStephen Wilson /// update the data extractor with the address size and byte order 107f325ba9dSStephen Wilson /// attributes as defined by the header. 108f325ba9dSStephen Wilson /// 109f325ba9dSStephen Wilson /// @param[in,out] data 110f325ba9dSStephen Wilson /// The DataExtractor to read from. Updated with the address size and 111f325ba9dSStephen Wilson /// byte order attributes appropriate to this header. 112f325ba9dSStephen Wilson /// 113f325ba9dSStephen Wilson /// @param[in,out] offset 114f325ba9dSStephen Wilson /// Pointer to an offset in the data. On return the offset will be 115f325ba9dSStephen Wilson /// advanced by the number of bytes read. 116f325ba9dSStephen Wilson /// 117f325ba9dSStephen Wilson /// @return 118f325ba9dSStephen Wilson /// True if the ELFSectionHeader was successfully read and false 119f325ba9dSStephen Wilson /// otherwise. 120f325ba9dSStephen Wilson bool 121f325ba9dSStephen Wilson Parse(lldb_private::DataExtractor &data, uint32_t *offset); 122f325ba9dSStephen Wilson 123f325ba9dSStephen Wilson //-------------------------------------------------------------------------- 124f325ba9dSStephen Wilson /// Examines at most EI_NIDENT bytes starting from the given pointer and 125f325ba9dSStephen Wilson /// determines if the magic ELF identification exists. 126f325ba9dSStephen Wilson /// 127f325ba9dSStephen Wilson /// @return 128f325ba9dSStephen Wilson /// True if the given sequence of bytes identifies an ELF file. 129f325ba9dSStephen Wilson static bool 130f325ba9dSStephen Wilson MagicBytesMatch(const uint8_t *magic); 131f325ba9dSStephen Wilson 132f325ba9dSStephen Wilson //-------------------------------------------------------------------------- 133f325ba9dSStephen Wilson /// Examines at most EI_NIDENT bytes starting from the given address and 134f325ba9dSStephen Wilson /// determines the address size of the underlying ELF file. This function 135f325ba9dSStephen Wilson /// should only be called on an pointer for which MagicBytesMatch returns 136f325ba9dSStephen Wilson /// true. 137f325ba9dSStephen Wilson /// 138f325ba9dSStephen Wilson /// @return 139f325ba9dSStephen Wilson /// The number of bytes forming an address in the ELF file (either 4 or 140f325ba9dSStephen Wilson /// 8), else zero if the address size could not be determined. 141f325ba9dSStephen Wilson static unsigned 142f325ba9dSStephen Wilson AddressSizeInBytes(const uint8_t *magic); 143f325ba9dSStephen Wilson }; 144f325ba9dSStephen Wilson 145f325ba9dSStephen Wilson //------------------------------------------------------------------------------ 146f325ba9dSStephen Wilson /// @class ELFSectionHeader 147f325ba9dSStephen Wilson /// @brief Generic representation of an ELF section header. 148f325ba9dSStephen Wilson struct ELFSectionHeader 149f325ba9dSStephen Wilson { 150f325ba9dSStephen Wilson elf_word sh_name; ///< Section name string index. 151f325ba9dSStephen Wilson elf_word sh_type; ///< Section type. 152f325ba9dSStephen Wilson elf_xword sh_flags; ///< Section attributes. 153f325ba9dSStephen Wilson elf_addr sh_addr; ///< Virtual address of the section in memory. 154f325ba9dSStephen Wilson elf_off sh_offset; ///< Start of section from beginning of file. 155f325ba9dSStephen Wilson elf_xword sh_size; ///< Number of bytes occupied in the file. 156f325ba9dSStephen Wilson elf_word sh_link; ///< Index of associated section. 157f325ba9dSStephen Wilson elf_word sh_info; ///< Extra section info (overloaded). 158f325ba9dSStephen Wilson elf_xword sh_addralign; ///< Power of two alignment constraint. 159f325ba9dSStephen Wilson elf_xword sh_entsize; ///< Byte size of each section entry. 160f325ba9dSStephen Wilson 161f325ba9dSStephen Wilson ELFSectionHeader(); 162f325ba9dSStephen Wilson 163f325ba9dSStephen Wilson //-------------------------------------------------------------------------- 164f325ba9dSStephen Wilson /// Parse an ELFSectionHeader entry from the given DataExtracter starting at 165f325ba9dSStephen Wilson /// position \p offset. 166f325ba9dSStephen Wilson /// 167f325ba9dSStephen Wilson /// @param[in] data 168f325ba9dSStephen Wilson /// The DataExtractor to read from. The address size of the extractor 169f325ba9dSStephen Wilson /// determines if a 32 or 64 bit object should be read. 170f325ba9dSStephen Wilson /// 171f325ba9dSStephen Wilson /// @param[in,out] offset 172f325ba9dSStephen Wilson /// Pointer to an offset in the data. On return the offset will be 173f325ba9dSStephen Wilson /// advanced by the number of bytes read. 174f325ba9dSStephen Wilson /// 175f325ba9dSStephen Wilson /// @return 176f325ba9dSStephen Wilson /// True if the ELFSectionHeader was successfully read and false 177f325ba9dSStephen Wilson /// otherwise. 178f325ba9dSStephen Wilson bool 179f325ba9dSStephen Wilson Parse(const lldb_private::DataExtractor &data, uint32_t *offset); 180f325ba9dSStephen Wilson }; 181f325ba9dSStephen Wilson 182f325ba9dSStephen Wilson //------------------------------------------------------------------------------ 183f325ba9dSStephen Wilson /// @class ELFProgramHeader 184f325ba9dSStephen Wilson /// @brief Generic representation of an ELF program header. 185f325ba9dSStephen Wilson struct ELFProgramHeader 186f325ba9dSStephen Wilson { 187*710dd5aeSGreg Clayton elf_word p_type; ///< Type of program segment. 188*710dd5aeSGreg Clayton elf_word p_flags; ///< Segment attributes. 189*710dd5aeSGreg Clayton elf_off p_offset; ///< Start of segment from beginning of file. 190f325ba9dSStephen Wilson elf_addr p_vaddr; ///< Virtual address of segment in memory. 191f325ba9dSStephen Wilson elf_addr p_paddr; ///< Physical address (for non-VM systems). 192f325ba9dSStephen Wilson elf_xword p_filesz; ///< Byte size of the segment in file. 193f325ba9dSStephen Wilson elf_xword p_memsz; ///< Byte size of the segment in memory. 194*710dd5aeSGreg Clayton elf_xword p_align; ///< Segment alignment constraint. 195f325ba9dSStephen Wilson 196f325ba9dSStephen Wilson ELFProgramHeader(); 197f325ba9dSStephen Wilson 198*710dd5aeSGreg Clayton /// Parse an ELFProgramHeader entry from the given DataExtractor starting at 199*710dd5aeSGreg Clayton /// position \p offset. The address size of the DataExtractor determines if 200f325ba9dSStephen Wilson /// a 32 or 64 bit object is to be parsed. 201f325ba9dSStephen Wilson /// 202f325ba9dSStephen Wilson /// @param[in] data 203f325ba9dSStephen Wilson /// The DataExtractor to read from. The address size of the extractor 204f325ba9dSStephen Wilson /// determines if a 32 or 64 bit object should be read. 205f325ba9dSStephen Wilson /// 206f325ba9dSStephen Wilson /// @param[in,out] offset 207f325ba9dSStephen Wilson /// Pointer to an offset in the data. On return the offset will be 208f325ba9dSStephen Wilson /// advanced by the number of bytes read. 209f325ba9dSStephen Wilson /// 210f325ba9dSStephen Wilson /// @return 211f325ba9dSStephen Wilson /// True if the ELFProgramHeader was successfully read and false 212f325ba9dSStephen Wilson /// otherwise. 213f325ba9dSStephen Wilson bool 214f325ba9dSStephen Wilson Parse(const lldb_private::DataExtractor &data, uint32_t *offset); 215f325ba9dSStephen Wilson }; 216f325ba9dSStephen Wilson 217f325ba9dSStephen Wilson //------------------------------------------------------------------------------ 218f325ba9dSStephen Wilson /// @class ELFSymbol 219f325ba9dSStephen Wilson /// @brief Represents a symbol within an ELF symbol table. 220f325ba9dSStephen Wilson struct ELFSymbol 221f325ba9dSStephen Wilson { 222f325ba9dSStephen Wilson elf_addr st_value; ///< Absolute or relocatable address. 223f325ba9dSStephen Wilson elf_xword st_size; ///< Size of the symbol or zero. 224f325ba9dSStephen Wilson elf_word st_name; ///< Symbol name string index. 225f325ba9dSStephen Wilson unsigned char st_info; ///< Symbol type and binding attributes. 226f325ba9dSStephen Wilson unsigned char st_other; ///< Reserved for future use. 227f325ba9dSStephen Wilson elf_half st_shndx; ///< Section to which this symbol applies. 228f325ba9dSStephen Wilson 229f325ba9dSStephen Wilson ELFSymbol(); 230f325ba9dSStephen Wilson 231f325ba9dSStephen Wilson /// Returns the binding attribute of the st_info member. 232f325ba9dSStephen Wilson unsigned char getBinding() const { return st_info >> 4; } 233f325ba9dSStephen Wilson 234f325ba9dSStephen Wilson /// Returns the type attribute of the st_info member. 235f325ba9dSStephen Wilson unsigned char getType() const { return st_info & 0x0F; } 236f325ba9dSStephen Wilson 237*710dd5aeSGreg Clayton /// Sets the binding and type of the st_info member. 238f325ba9dSStephen Wilson void setBindingAndType(unsigned char binding, unsigned char type) { 239f325ba9dSStephen Wilson st_info = (binding << 4) + (type & 0x0F); 240f325ba9dSStephen Wilson } 241f325ba9dSStephen Wilson 242*710dd5aeSGreg Clayton /// Parse an ELFSymbol entry from the given DataExtractor starting at 243*710dd5aeSGreg Clayton /// position \p offset. The address size of the DataExtractor determines if 244f325ba9dSStephen Wilson /// a 32 or 64 bit object is to be parsed. 245f325ba9dSStephen Wilson /// 246f325ba9dSStephen Wilson /// @param[in] data 247f325ba9dSStephen Wilson /// The DataExtractor to read from. The address size of the extractor 248f325ba9dSStephen Wilson /// determines if a 32 or 64 bit object should be read. 249f325ba9dSStephen Wilson /// 250f325ba9dSStephen Wilson /// @param[in,out] offset 251f325ba9dSStephen Wilson /// Pointer to an offset in the data. On return the offset will be 252f325ba9dSStephen Wilson /// advanced by the number of bytes read. 253f325ba9dSStephen Wilson /// 254f325ba9dSStephen Wilson /// @return 255f325ba9dSStephen Wilson /// True if the ELFSymbol was successfully read and false otherwise. 256f325ba9dSStephen Wilson bool 257f325ba9dSStephen Wilson Parse(const lldb_private::DataExtractor &data, uint32_t *offset); 258f325ba9dSStephen Wilson }; 259f325ba9dSStephen Wilson 260f325ba9dSStephen Wilson //------------------------------------------------------------------------------ 261f325ba9dSStephen Wilson /// @class ELFDynamic 262f325ba9dSStephen Wilson /// @brief Represents an entry in an ELF dynamic table. 263f325ba9dSStephen Wilson struct ELFDynamic 264f325ba9dSStephen Wilson { 265f325ba9dSStephen Wilson elf_sxword d_tag; ///< Type of dynamic table entry. 266f325ba9dSStephen Wilson union 267f325ba9dSStephen Wilson { 268f325ba9dSStephen Wilson elf_xword d_val; ///< Integer value of the table entry. 269f325ba9dSStephen Wilson elf_addr d_ptr; ///< Pointer value of the table entry. 270f325ba9dSStephen Wilson }; 271f325ba9dSStephen Wilson 272f325ba9dSStephen Wilson ELFDynamic(); 273f325ba9dSStephen Wilson 274*710dd5aeSGreg Clayton /// Parse an ELFDynamic entry from the given DataExtractor starting at 275*710dd5aeSGreg Clayton /// position \p offset. The address size of the DataExtractor determines if 276f325ba9dSStephen Wilson /// a 32 or 64 bit object is to be parsed. 277f325ba9dSStephen Wilson /// 278f325ba9dSStephen Wilson /// @param[in] data 279f325ba9dSStephen Wilson /// The DataExtractor to read from. The address size of the extractor 280f325ba9dSStephen Wilson /// determines if a 32 or 64 bit object should be read. 281f325ba9dSStephen Wilson /// 282f325ba9dSStephen Wilson /// @param[in,out] offset 283f325ba9dSStephen Wilson /// Pointer to an offset in the data. On return the offset will be 284f325ba9dSStephen Wilson /// advanced by the number of bytes read. 285f325ba9dSStephen Wilson /// 286f325ba9dSStephen Wilson /// @return 287f325ba9dSStephen Wilson /// True if the ELFDynamic entry was successfully read and false 288f325ba9dSStephen Wilson /// otherwise. 289f325ba9dSStephen Wilson bool 290f325ba9dSStephen Wilson Parse(const lldb_private::DataExtractor &data, uint32_t *offset); 291f325ba9dSStephen Wilson }; 292f325ba9dSStephen Wilson 293f325ba9dSStephen Wilson } // End namespace elf. 294f325ba9dSStephen Wilson 295f325ba9dSStephen Wilson #endif // #ifndef liblldb_ELFHeader_h_ 296