diff options
author | Stephen Wilson <wilsons@start.ca> | 2011-03-30 15:59:12 +0000 |
---|---|---|
committer | Stephen Wilson <wilsons@start.ca> | 2011-03-30 15:59:12 +0000 |
commit | 43fe645b62ddcf9f66560fec7d1eb728b8b39f50 (patch) | |
tree | fb4088515631a4a2638f9924989783e1b23d1960 /lldb/source/Plugins/ObjectFile/ELF/ELFHeader.cpp | |
parent | 84ffe7033c41fd3501eab22632cab93d7df7b1a9 (diff) | |
download | bcm5719-llvm-43fe645b62ddcf9f66560fec7d1eb728b8b39f50.tar.gz bcm5719-llvm-43fe645b62ddcf9f66560fec7d1eb728b8b39f50.zip |
elf: add support for ELF relocation entries
llvm-svn: 128548
Diffstat (limited to 'lldb/source/Plugins/ObjectFile/ELF/ELFHeader.cpp')
-rw-r--r-- | lldb/source/Plugins/ObjectFile/ELF/ELFHeader.cpp | 73 |
1 files changed, 72 insertions, 1 deletions
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ELFHeader.cpp b/lldb/source/Plugins/ObjectFile/ELF/ELFHeader.cpp index 3fd795be4c1..bfff9f3336e 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ELFHeader.cpp +++ b/lldb/source/Plugins/ObjectFile/ELF/ELFHeader.cpp @@ -153,6 +153,33 @@ ELFHeader::AddressSizeInBytes(const uint8_t *magic) return address_size; } +unsigned +ELFHeader::GetRelocationJumpSlotType() const +{ + unsigned slot = 0; + + switch (e_machine) + { + default: + assert(false && "architecture not supported"); + break; + case EM_386: + case EM_486: + slot = R_386_JUMP_SLOT; + break; + case EM_X86_64: + slot = R_X86_64_JUMP_SLOT; + break; + case EM_ARM: + slot = R_ARM_JUMP_SLOT; + break; + case EM_MBLAZE: + slot = R_MICROBLAZE_JUMP_SLOT; + } + + return slot; +} + //------------------------------------------------------------------------------ // ELFSectionHeader @@ -293,10 +320,54 @@ ELFDynamic::ELFDynamic() } bool -ELFDynamic::Parse(const lldb_private::DataExtractor &data, uint32_t *offset) +ELFDynamic::Parse(const lldb_private::DataExtractor &data, uint32_t *offset) { const unsigned byte_size = data.GetAddressByteSize(); return GetMaxS64(data, offset, &d_tag, byte_size, 2); } +//------------------------------------------------------------------------------ +// ELFRel + +ELFRel::ELFRel() +{ + memset(this, 0, sizeof(ELFRel)); +} + +bool +ELFRel::Parse(const lldb_private::DataExtractor &data, uint32_t *offset) +{ + const unsigned byte_size = data.GetAddressByteSize(); + + // Read r_offset and r_info. + if (GetMaxU64(data, offset, &r_offset, byte_size, 2) == false) + return false; + + return true; +} + +//------------------------------------------------------------------------------ +// ELFRela + +ELFRela::ELFRela() +{ + memset(this, 0, sizeof(ELFRela)); +} + +bool +ELFRela::Parse(const lldb_private::DataExtractor &data, uint32_t *offset) +{ + const unsigned byte_size = data.GetAddressByteSize(); + + // Read r_offset and r_info. + if (GetMaxU64(data, offset, &r_offset, byte_size, 2) == false) + return false; + + // Read r_addend; + if (GetMaxS64(data, offset, &r_addend, byte_size) == false) + return false; + + return true; +} + |