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