1ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//===-- ELFHeader.cpp ----------------------------------------- -*- 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#include <cstring>
11ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
12ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson#include "lldb/Core/DataExtractor.h"
13f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton#include "lldb/Core/Section.h"
14f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton#include "lldb/Core/Stream.h"
15ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
16ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson#include "ELFHeader.h"
17ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
18ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonusing namespace elf;
19ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonusing namespace lldb;
20ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonusing namespace llvm::ELF;
21ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
22ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//------------------------------------------------------------------------------
23ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson// Static utility functions.
24ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//
25ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson// GetMaxU64 and GetMaxS64 wrap the similarly named methods from DataExtractor
26ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson// with error handling code and provide for parsing a sequence of values.
27ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonstatic bool
2836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonGetMaxU64(const lldb_private::DataExtractor &data,
2936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton          lldb::offset_t *offset,
3036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton          uint64_t *value,
3136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton          uint32_t byte_size)
32ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{
3336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    const lldb::offset_t saved_offset = *offset;
34ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    *value = data.GetMaxU64(offset, byte_size);
35ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    return *offset != saved_offset;
36ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson}
37ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
38ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonstatic bool
39ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonGetMaxU64(const lldb_private::DataExtractor &data,
4036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton          lldb::offset_t *offset,
4136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton          uint64_t *value,
4236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton          uint32_t byte_size,
43ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson          uint32_t count)
44ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{
4536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    lldb::offset_t saved_offset = *offset;
46ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
47ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    for (uint32_t i = 0; i < count; ++i, ++value)
48ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    {
49ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        if (GetMaxU64(data, offset, value, byte_size) == false)
50ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        {
51ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson            *offset = saved_offset;
52ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson            return false;
53ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        }
54ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    }
55ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    return true;
56ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson}
57ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
58ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonstatic bool
59ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonGetMaxS64(const lldb_private::DataExtractor &data,
6036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton          lldb::offset_t *offset,
6136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton          int64_t *value,
6236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton          uint32_t byte_size)
63ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{
6436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    const lldb::offset_t saved_offset = *offset;
65ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    *value = data.GetMaxS64(offset, byte_size);
66ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    return *offset != saved_offset;
67ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson}
68ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
69ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonstatic bool
70ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonGetMaxS64(const lldb_private::DataExtractor &data,
7136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton          lldb::offset_t *offset,
7236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton          int64_t *value,
7336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton          uint32_t byte_size,
74ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson          uint32_t count)
75ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{
7636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    lldb::offset_t saved_offset = *offset;
77ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
78ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    for (uint32_t i = 0; i < count; ++i, ++value)
79ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    {
80ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        if (GetMaxS64(data, offset, value, byte_size) == false)
81ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        {
82ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson            *offset = saved_offset;
83ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson            return false;
84ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        }
85ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    }
86ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    return true;
87ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson}
88ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
89ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//------------------------------------------------------------------------------
90ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson// ELFHeader
91ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
92ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonELFHeader::ELFHeader()
93ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{
94ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    memset(this, 0, sizeof(ELFHeader));
95ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson}
96ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
97ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonByteOrder
98ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonELFHeader::GetByteOrder() const
99ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{
100ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    if (e_ident[EI_DATA] == ELFDATA2MSB)
101ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        return eByteOrderBig;
102ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    if (e_ident[EI_DATA] == ELFDATA2LSB)
103ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        return eByteOrderLittle;
104ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    return eByteOrderInvalid;
105ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson}
106ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
107ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonbool
10836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonELFHeader::Parse(lldb_private::DataExtractor &data, lldb::offset_t *offset)
109ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{
110ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    // Read e_ident.  This provides byte order and address size info.
111ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    if (data.GetU8(offset, &e_ident, EI_NIDENT) == NULL)
112ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        return false;
113ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
114ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    const unsigned byte_size = Is32Bit() ? 4 : 8;
115ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    data.SetByteOrder(GetByteOrder());
116ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    data.SetAddressByteSize(byte_size);
117ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
118ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    // Read e_type and e_machine.
119ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    if (data.GetU16(offset, &e_type, 2) == NULL)
120ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        return false;
121ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
122ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    // Read e_version.
123ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    if (data.GetU32(offset, &e_version, 1) == NULL)
124ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        return false;
125ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
126ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    // Read e_entry, e_phoff and e_shoff.
127ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    if (GetMaxU64(data, offset, &e_entry, byte_size, 3) == false)
128ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        return false;
129ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
130ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    // Read e_flags.
131ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    if (data.GetU32(offset, &e_flags, 1) == NULL)
132ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        return false;
133ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
134ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    // Read e_ehsize, e_phentsize, e_phnum, e_shentsize, e_shnum and
135ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    // e_shstrndx.
136ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    if (data.GetU16(offset, &e_ehsize, 6) == NULL)
137ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        return false;
138ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
139ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    return true;
140ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson}
141ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
142ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonbool
143ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonELFHeader::MagicBytesMatch(const uint8_t *magic)
144ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{
145ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    return memcmp(magic, ElfMagic, strlen(ElfMagic)) == 0;
146ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson}
147ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
148ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonunsigned
149ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonELFHeader::AddressSizeInBytes(const uint8_t *magic)
150ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{
151ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    unsigned address_size = 0;
152ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
153ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    switch (magic[EI_CLASS])
154ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    {
155ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    case ELFCLASS32:
156ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        address_size = 4;
157ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        break;
158ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
159ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    case ELFCLASS64:
160ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        address_size = 8;
161ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        break;
162ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    }
163ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    return address_size;
164ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson}
165ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
1669b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilsonunsigned
1679b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen WilsonELFHeader::GetRelocationJumpSlotType() const
1689b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson{
1699b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson    unsigned slot = 0;
1709b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson
1719b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson    switch (e_machine)
1729b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson    {
1739b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson    default:
1749b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson        assert(false && "architecture not supported");
1759b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson        break;
1769b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson    case EM_386:
1779b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson    case EM_486:
1789b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson        slot = R_386_JUMP_SLOT;
1799b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson        break;
1809b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson    case EM_X86_64:
1819b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson        slot = R_X86_64_JUMP_SLOT;
1829b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson        break;
1839b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson    case EM_ARM:
1849b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson        slot = R_ARM_JUMP_SLOT;
1859b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson        break;
1869b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson    }
1879b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson
1889b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson    return slot;
1899b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson}
1909b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson
191ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//------------------------------------------------------------------------------
192ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson// ELFSectionHeader
193ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
194ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonELFSectionHeader::ELFSectionHeader()
195ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{
196ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    memset(this, 0, sizeof(ELFSectionHeader));
197ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson}
198ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
199ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonbool
200ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonELFSectionHeader::Parse(const lldb_private::DataExtractor &data,
20136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                        lldb::offset_t *offset)
202ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{
203ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    const unsigned byte_size = data.GetAddressByteSize();
204ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
205ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    // Read sh_name and sh_type.
206ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    if (data.GetU32(offset, &sh_name, 2) == NULL)
207ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        return false;
208ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
209ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    // Read sh_flags.
210ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    if (GetMaxU64(data, offset, &sh_flags, byte_size) == false)
211ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        return false;
212ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
213ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    // Read sh_addr, sh_off and sh_size.
214ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    if (GetMaxU64(data, offset, &sh_addr, byte_size, 3) == false)
215ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        return false;
216ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
217ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    // Read sh_link and sh_info.
218ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    if (data.GetU32(offset, &sh_link, 2) == NULL)
219ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        return false;
220ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
221ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    // Read sh_addralign and sh_entsize.
222ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    if (GetMaxU64(data, offset, &sh_addralign, byte_size, 2) == false)
223ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        return false;
224ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
225ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    return true;
226ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson}
227ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
228ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//------------------------------------------------------------------------------
229ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson// ELFSymbol
230ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
231ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonELFSymbol::ELFSymbol()
232ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{
233ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    memset(this, 0, sizeof(ELFSymbol));
234ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson}
235ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
236f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton#define ENUM_TO_CSTR(e) case e: return #e
237f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton
238f58438fa7751274b6f4e4b1805940127dce13b00Greg Claytonconst char *
239f58438fa7751274b6f4e4b1805940127dce13b00Greg ClaytonELFSymbol::bindingToCString(unsigned char binding)
240f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton{
241f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    switch (binding)
242f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    {
243f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(STB_LOCAL);
244f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(STB_GLOBAL);
245f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(STB_WEAK);
246f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(STB_LOOS);
247f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(STB_HIOS);
248f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(STB_LOPROC);
249f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(STB_HIPROC);
250f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    }
251f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    return "";
252f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton}
253f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton
254f58438fa7751274b6f4e4b1805940127dce13b00Greg Claytonconst char *
255f58438fa7751274b6f4e4b1805940127dce13b00Greg ClaytonELFSymbol::typeToCString(unsigned char type)
256f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton{
257f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    switch (type)
258f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    {
259f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(STT_NOTYPE);
260f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(STT_OBJECT);
261f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(STT_FUNC);
262f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(STT_SECTION);
263f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(STT_FILE);
264f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(STT_COMMON);
265f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(STT_TLS);
266f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(STT_LOOS);
267f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(STT_HIOS);
268f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(STT_GNU_IFUNC);
269f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(STT_LOPROC);
270f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(STT_HIPROC);
271f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    }
272f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    return "";
273f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton}
274f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton
275f58438fa7751274b6f4e4b1805940127dce13b00Greg Claytonconst char *
276f58438fa7751274b6f4e4b1805940127dce13b00Greg ClaytonELFSymbol::sectionIndexToCString (elf_half shndx,
277f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton                                  const lldb_private::SectionList *section_list)
278f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton{
279f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    switch (shndx)
280f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    {
281f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(SHN_UNDEF);
282f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(SHN_LOPROC);
283f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(SHN_HIPROC);
284f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(SHN_LOOS);
285f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(SHN_HIOS);
286f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(SHN_ABS);
287f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(SHN_COMMON);
288f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    ENUM_TO_CSTR(SHN_XINDEX);
289f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    default:
290f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton        {
291f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton            const lldb_private::Section *section = section_list->GetSectionAtIndex(shndx).get();
292f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton            if (section)
293f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton                return section->GetName().AsCString("");
294f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton        }
295f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton        break;
296f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    }
297f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton    return "";
298f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton}
299f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton
300f58438fa7751274b6f4e4b1805940127dce13b00Greg Claytonvoid
301f58438fa7751274b6f4e4b1805940127dce13b00Greg ClaytonELFSymbol::Dump (lldb_private::Stream *s,
302f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton                 uint32_t idx,
303f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton                 const lldb_private::DataExtractor *strtab_data,
304f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton                 const lldb_private::SectionList *section_list)
305f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton{
306884288bcb6824452a3c64eb772c0976501acc47aMatt Kopec    s->Printf("[%3u] 0x%16.16" PRIx64 " 0x%16.16" PRIx64 " 0x%8.8x 0x%2.2x (%-10s %-13s) 0x%2.2x 0x%4.4x (%-10s) %s\n",
307f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton              idx,
308f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton              st_value,
309f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton              st_size,
310f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton              st_name,
311f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton              st_info,
312f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton              bindingToCString (getBinding()),
313f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton              typeToCString (getType()),
314f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton              st_other,
315f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton              st_shndx,
316f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton              sectionIndexToCString (st_shndx, section_list),
317f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton              strtab_data ? strtab_data->PeekCStr(st_name) : "");
318f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton}
319f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton
320ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonbool
32136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonELFSymbol::Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset)
322ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{
323ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    const unsigned byte_size = data.GetAddressByteSize();
324ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    const bool parsing_32 = byte_size == 4;
325ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
326ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    // Read st_name.
327ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    if (data.GetU32(offset, &st_name, 1) == NULL)
328ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        return false;
329ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
330ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    if (parsing_32)
331ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    {
332ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        // Read st_value and st_size.
333ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        if (GetMaxU64(data, offset, &st_value, byte_size, 2) == false)
334ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson            return false;
335ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
336ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        // Read st_info and st_other.
337ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        if (data.GetU8(offset, &st_info, 2) == NULL)
338ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson            return false;
339ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
340ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        // Read st_shndx.
341ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        if (data.GetU16(offset, &st_shndx, 1) == NULL)
342ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson            return false;
343ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    }
344ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    else
345ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    {
346ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        // Read st_info and st_other.
347ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        if (data.GetU8(offset, &st_info, 2) == NULL)
348ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson            return false;
349ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
350ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        // Read st_shndx.
351ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        if (data.GetU16(offset, &st_shndx, 1) == NULL)
352ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson            return false;
353ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
354ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        // Read st_value and st_size.
355ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        if (data.GetU64(offset, &st_value, 2) == NULL)
356ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson            return false;
357ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    }
358ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    return true;
359ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson}
360ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
361ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//------------------------------------------------------------------------------
362ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson// ELFProgramHeader
363ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
364ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonELFProgramHeader::ELFProgramHeader()
365ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{
366ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    memset(this, 0, sizeof(ELFProgramHeader));
367ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson}
368ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
369ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonbool
370ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonELFProgramHeader::Parse(const lldb_private::DataExtractor &data,
37136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                        lldb::offset_t *offset)
372ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{
373ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    const uint32_t byte_size = data.GetAddressByteSize();
374ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    const bool parsing_32 = byte_size == 4;
375ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
376ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    // Read p_type;
377ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    if (data.GetU32(offset, &p_type, 1) == NULL)
378ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        return false;
379ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
380ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    if (parsing_32) {
381ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        // Read p_offset, p_vaddr, p_paddr, p_filesz and p_memsz.
382ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        if (GetMaxU64(data, offset, &p_offset, byte_size, 5) == false)
383ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson            return false;
384ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
385ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        // Read p_flags.
386ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        if (data.GetU32(offset, &p_flags, 1) == NULL)
387ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson            return false;
388ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
389ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        // Read p_align.
390ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        if (GetMaxU64(data, offset, &p_align, byte_size) == false)
391ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson            return false;
392ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    }
393ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    else {
394ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        // Read p_flags.
395ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        if (data.GetU32(offset, &p_flags, 1) == NULL)
396ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson            return false;
397ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
398ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        // Read p_offset, p_vaddr, p_paddr, p_filesz, p_memsz and p_align.
399ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson        if (GetMaxU64(data, offset, &p_offset, byte_size, 6) == false)
400ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson            return false;
401ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    }
402ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
403ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    return true;
404ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson}
405ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
406ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//------------------------------------------------------------------------------
407ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson// ELFDynamic
408ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
409ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonELFDynamic::ELFDynamic()
410ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{
411ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    memset(this, 0, sizeof(ELFDynamic));
412ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson}
413ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
414ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonbool
41536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonELFDynamic::Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset)
416ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{
417ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    const unsigned byte_size = data.GetAddressByteSize();
418ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson    return GetMaxS64(data, offset, &d_tag, byte_size, 2);
419ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson}
420ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
4219b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson//------------------------------------------------------------------------------
4229b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson// ELFRel
4239b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson
4249b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen WilsonELFRel::ELFRel()
4259b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson{
4269b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson    memset(this, 0, sizeof(ELFRel));
4279b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson}
4289b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson
4299b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilsonbool
43036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonELFRel::Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset)
4319b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson{
4329b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson    const unsigned byte_size = data.GetAddressByteSize();
4339b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson
4349b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson    // Read r_offset and r_info.
4359b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson    if (GetMaxU64(data, offset, &r_offset, byte_size, 2) == false)
4369b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson        return false;
4379b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson
4389b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson    return true;
4399b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson}
4409b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson
4419b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson//------------------------------------------------------------------------------
4429b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson// ELFRela
4439b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson
4449b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen WilsonELFRela::ELFRela()
4459b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson{
4469b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson    memset(this, 0, sizeof(ELFRela));
4479b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson}
4489b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson
4499b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilsonbool
45036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonELFRela::Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset)
4519b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson{
4529b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson    const unsigned byte_size = data.GetAddressByteSize();
4539b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson
4549b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson    // Read r_offset and r_info.
4559b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson    if (GetMaxU64(data, offset, &r_offset, byte_size, 2) == false)
4569b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson        return false;
4579b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson
4589b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson    // Read r_addend;
4599b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson    if (GetMaxS64(data, offset, &r_addend, byte_size) == false)
4609b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson        return false;
4619b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson
4629b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson    return true;
4639b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson}
4649b01e48699a94bd6986e7cd4bb5415aba8c923c5Stephen Wilson
465ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson
466