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