Add relocation size

This commit is contained in:
Romain Thomas 2017-06-28 17:45:12 +02:00
parent 78b876f700
commit 25b9985c80
16 changed files with 993 additions and 171 deletions

View File

@ -66,6 +66,10 @@ void init_ELF_Relocation_class(py::module& m) {
static_cast<getter_t<bool>>(&Relocation::is_rel),
"``True`` if the relocation doesn't use the :attr:`~lief.ELF.Relocation.addend` proprety")
.def_property_readonly("size",
static_cast<getter_t<uint32_t>>(&Relocation::size),
"Size in **bits** of the value patched by the relocation")
.def("__eq__", &Relocation::operator==)
.def("__ne__", &Relocation::operator!=)

View File

@ -700,6 +700,12 @@ void init_ELF_Structures_enum(py::module& m) {
.value(PY_ENUM(RELOC_ARM::R_ARM_THM_TLS_DESCSEQ16))
.value(PY_ENUM(RELOC_ARM::R_ARM_THM_TLS_DESCSEQ32))
.value(PY_ENUM(RELOC_ARM::R_ARM_IRELATIVE))
.value(PY_ENUM(RELOC_ARM::R_ARM_RXPC25))
.value(PY_ENUM(RELOC_ARM::R_ARM_RSBREL32))
.value(PY_ENUM(RELOC_ARM::R_ARM_THM_RPC22))
.value(PY_ENUM(RELOC_ARM::R_ARM_RREL32))
.value(PY_ENUM(RELOC_ARM::R_ARM_RPC24))
.value(PY_ENUM(RELOC_ARM::R_ARM_RBASE))
.export_values();
@ -748,6 +754,133 @@ void init_ELF_Structures_enum(py::module& m) {
.export_values();
py::enum_<RELOC_AARCH64>(m, "RELOCATION_AARCH64")
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_NONE))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_ABS64))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_ABS32))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_ABS16))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_PREL64))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_PREL32))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_PREL16))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_MOVW_UABS_G0))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_MOVW_UABS_G0_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_MOVW_UABS_G1))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_MOVW_UABS_G1_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_MOVW_UABS_G2))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_MOVW_UABS_G2_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_MOVW_UABS_G3))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_MOVW_SABS_G0))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_MOVW_SABS_G1))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_MOVW_SABS_G2))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_LD_PREL_LO19))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_ADR_PREL_LO21))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_ADR_PREL_PG_HI21))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_ADR_PREL_PG_HI21_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_ADD_ABS_LO12_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_LDST8_ABS_LO12_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TSTBR14))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_CONDBR19))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_JUMP26))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_CALL26))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_LDST16_ABS_LO12_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_LDST32_ABS_LO12_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_LDST64_ABS_LO12_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_MOVW_PREL_G0))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_MOVW_PREL_G0_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_MOVW_PREL_G1))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_MOVW_PREL_G1_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_MOVW_PREL_G2))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_MOVW_PREL_G2_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_MOVW_PREL_G3))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_LDST128_ABS_LO12_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G0))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G0_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G1))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G1_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G2))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G2_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G3))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_GOTREL64))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_GOTREL32))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_GOT_LD_PREL19))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_LD64_GOTOFF_LO15))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_ADR_GOT_PAGE))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_LD64_GOT_LO12_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_LD64_GOTPAGE_LO15))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSGD_ADR_PREL21))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSGD_ADR_PAGE21))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSGD_ADD_LO12_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSGD_MOVW_G1))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSGD_MOVW_G0_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLD_ADR_PREL21))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLD_ADR_PAGE21))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLD_ADD_LO12_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_G1))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_G0_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLD_LD_PREL19))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_DTPREL_G2))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_DTPREL_G1))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_DTPREL_G0))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLD_ADD_DTPREL_HI12))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLD_ADD_DTPREL_LO12))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLD_LDST8_DTPREL_LO12))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLD_LDST16_DTPREL_LO12))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLD_LDST32_DTPREL_LO12))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLD_LDST64_DTPREL_LO12))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSIE_MOVW_GOTTPREL_G1))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSIE_LD_GOTTPREL_PREL19))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLE_MOVW_TPREL_G2))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLE_MOVW_TPREL_G1))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLE_MOVW_TPREL_G1_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLE_MOVW_TPREL_G0))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLE_MOVW_TPREL_G0_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLE_ADD_TPREL_HI12))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLE_ADD_TPREL_LO12))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLE_ADD_TPREL_LO12_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLE_LDST8_TPREL_LO12))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLE_LDST16_TPREL_LO12))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLE_LDST32_TPREL_LO12))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLE_LDST64_TPREL_LO12))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSDESC_LD_PREL19))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSDESC_ADR_PREL21))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSDESC_ADR_PAGE21))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSDESC_LD64_LO12_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSDESC_ADD_LO12_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSDESC_OFF_G1))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSDESC_OFF_G0_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSDESC_LDR))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSDESC_ADD))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSDESC_CALL))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLE_LDST128_TPREL_LO12))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLD_LDST128_DTPREL_LO12))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_COPY))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_GLOB_DAT))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_JUMP_SLOT))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_RELATIVE))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLS_DTPREL64))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLS_DTPMOD64))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLS_TPREL64))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_TLSDESC))
.value(PY_ENUM(RELOC_AARCH64::R_AARCH64_IRELATIVE))
.export_values();
py::enum_<DYNSYM_COUNT_METHODS>(m, "DYNSYM_COUNT_METHODS")
.value(PY_ENUM(DYNSYM_COUNT_METHODS::COUNT_AUTO))
.value(PY_ENUM(DYNSYM_COUNT_METHODS::COUNT_SECTION))

View File

@ -176,10 +176,10 @@ def print_relocations(binary):
## Dynamic relocations ##
if len(dynamicrelocations) > 0:
print("== Dynamic Relocations ==\n")
f_title = "|{:<10} | {:<10}| {:<30} |"
f_value = "|0x{:<8x} | {:<10}| {:<30} |"
f_title = "|{:<10} | {:<10}| {:<8}| {:<30} |"
f_value = "|0x{:<8x} | {:<10}| {:<8d}| {:<30} |"
print(f_title.format("Address", "Type", "Symbol"))
print(f_title.format("Address", "Type", "Size", "Symbol"))
for relocation in dynamicrelocations:
type = str(relocation.type)
@ -189,19 +189,24 @@ def print_relocations(binary):
type = str(ELF.RELOCATION_i386(relocation.type))
elif binary.header.machine_type == ELF.ARCH.ARM:
type = str(ELF.RELOCATION_ARM(relocation.type))
try:
s = relocation.symbol
print(f_value.format(relocation.address, type.split(".")[-1], str(relocation.symbol.name)))
except lief.not_found:
pass
elif binary.header.machine_type == ELF.ARCH.AARCH64:
type = str(ELF.RELOCATION_AARCH64(relocation.type))
symbol_name = str(relocation.symbol.name) if relocation.has_symbol else ""
print(f_value.format(
relocation.address,
type.split(".")[-1],
relocation.size,
symbol_name))
if len(pltgot_relocations) > 0:
print("== PLT/GOT Relocations ==\n")
f_title = "|{:<10} | {:<10} |{:<30}|"
f_value = "|0x{:<8x} | {:<10} | {:<30}|"
f_title = "|{:<10} | {:<10}| {:<8}| {:<30} |"
f_value = "|0x{:<8x} | {:<10}| {:<8d}| {:<30} |"
print(f_title.format("Address", "Type", "Symbol"))
print(f_title.format("Address", "Type", "Size", "Symbol"))
for relocation in pltgot_relocations:
type = str(relocation.type)
@ -211,9 +216,15 @@ def print_relocations(binary):
type = str(ELF.RELOCATION_i386(relocation.type))
elif binary.header.machine_type == ELF.ARCH.ARM:
type = str(ELF.RELOCATION_ARM(relocation.type))
elif binary.header.machine_type == ELF.ARCH.AARCH64:
type = str(ELF.RELOCATION_AARCH64(relocation.type))
symbol_name = str(relocation.symbol.name) if relocation.has_symbol else ""
print(f_value.format(relocation.address, type.split(".")[-1], symbol_name))
print(f_value.format(
relocation.address,
type.split(".")[-1],
relocation.size,
symbol_name))
def print_exported_symbols(binary):
symbols = binary.exported_symbols
@ -311,15 +322,22 @@ def print_notes(binary):
print("Note #{:d}".format(idx))
print(format_str.format("Name:", note.name))
print(format_str.format("Type:", ELF.NOTE_TYPES(note.type)))
print(format_str.format("Type:", str(ELF.NOTE_TYPES(note.type)).split(".")[-1]))
print(format_str.format("Description:", description_str))
if ELF.NOTE_TYPES(note.type) == ELF.NOTE_TYPES.ABI_TAG:
version = note.version
version_str = "{:d}.{:d}.{:d}".format(version[0], version[1], version[2])
try:
version = note.version
version_str = "{:d}.{:d}.{:d}".format(version[0], version[1], version[2])
print(format_str.format("ABI:", note.abi))
print(format_str.format("Version:", version_str))
except lief.corrupted:
pass
if ELF.NOTE_TYPES(note.type) == ELF.NOTE_TYPES.GOLD_VERSION:
print(format_str.format("Version:", "".join(map(chr, note.description))))
print(format_str.format("ABI:", note.abi))
print(format_str.format("Version:", version_str))
print("\n")

0
examples/python/macho_reader.py Normal file → Executable file
View File

View File

@ -33,6 +33,7 @@ DLL_PUBLIC const char* to_string(SYMBOL_TYPES e);
DLL_PUBLIC const char* to_string(RELOC_x86_64 e);
DLL_PUBLIC const char* to_string(RELOC_ARM e);
DLL_PUBLIC const char* to_string(RELOC_i386 e);
DLL_PUBLIC const char* to_string(RELOC_AARCH64 e);
DLL_PUBLIC const char* to_string(ELF_CLASS e);
DLL_PUBLIC const char* to_string(ELF_DATA e);
DLL_PUBLIC const char* to_string(OS_ABI e);

View File

@ -17,6 +17,7 @@
#define LIEF_ELF_RELOCATION_H_
#include <string>
#include <map>
#include <iostream>
#include "LIEF/Visitable.hpp"
@ -53,6 +54,9 @@ class DLL_PUBLIC Relocation : public Visitable {
bool is_rel(void) const;
ARCH architecture(void) const;
//! @brief Return the **bit** size of the value to patch
uint32_t size(void) const;
bool has_symbol(void) const;
Symbol& symbol(void);
const Symbol& symbol(void) const;

View File

@ -0,0 +1,382 @@
/* Copyright 2017 R. Thomas
* Copyright 2017 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef LIEF_ELF_RELOCATIONSIZE_H_
#define LIEF_ELF_RELOCATIONSIZE_H_
#include <map>
#include "LIEF/ELF/enums.hpp"
namespace LIEF {
namespace ELF {
// TODO: Use Frozen https://github.com/serge-sans-paille/frozen
static const std::map<RELOC_x86_64, uint32_t> relocation_x86_64_sizes {
{RELOC_x86_64::R_X86_64_NONE, 0 },
{RELOC_x86_64::R_X86_64_64, 64 },
{RELOC_x86_64::R_X86_64_PC32, 32 },
{RELOC_x86_64::R_X86_64_GOT32, 32 },
{RELOC_x86_64::R_X86_64_PLT32, 32 },
{RELOC_x86_64::R_X86_64_COPY, 32 },
{RELOC_x86_64::R_X86_64_GLOB_DAT, 64 },
{RELOC_x86_64::R_X86_64_JUMP_SLOT, 64 },
{RELOC_x86_64::R_X86_64_RELATIVE, 64 },
{RELOC_x86_64::R_X86_64_GOTPCREL, 32 },
{RELOC_x86_64::R_X86_64_32, 32 },
{RELOC_x86_64::R_X86_64_32S, 32 },
{RELOC_x86_64::R_X86_64_16, 16 },
{RELOC_x86_64::R_X86_64_PC16, 16 },
{RELOC_x86_64::R_X86_64_8, 8 },
{RELOC_x86_64::R_X86_64_PC8, 8 },
{RELOC_x86_64::R_X86_64_DTPMOD64, 64 },
{RELOC_x86_64::R_X86_64_DTPOFF64, 64 },
{RELOC_x86_64::R_X86_64_TPOFF64, 64 },
{RELOC_x86_64::R_X86_64_TLSGD, 32 },
{RELOC_x86_64::R_X86_64_TLSLD, 32 },
{RELOC_x86_64::R_X86_64_DTPOFF32, 32 },
{RELOC_x86_64::R_X86_64_GOTTPOFF, 32 },
{RELOC_x86_64::R_X86_64_TPOFF32, 32 },
{RELOC_x86_64::R_X86_64_PC64, 64 },
{RELOC_x86_64::R_X86_64_GOTOFF64, 64 },
{RELOC_x86_64::R_X86_64_GOTPC32, 32 },
{RELOC_x86_64::R_X86_64_GOT64, 64 },
{RELOC_x86_64::R_X86_64_GOTPCREL64, 64 },
{RELOC_x86_64::R_X86_64_GOTPC64, 64 },
{RELOC_x86_64::R_X86_64_GOTPLT64, 64 },
{RELOC_x86_64::R_X86_64_PLTOFF64, 64 },
{RELOC_x86_64::R_X86_64_SIZE32, 32 },
{RELOC_x86_64::R_X86_64_SIZE64, 64 },
{RELOC_x86_64::R_X86_64_GOTPC32_TLSDESC, 32 },
{RELOC_x86_64::R_X86_64_TLSDESC_CALL, 0 },
{RELOC_x86_64::R_X86_64_TLSDESC, 64 },
{RELOC_x86_64::R_X86_64_IRELATIVE, 64 },
};
static const std::map<RELOC_i386, uint32_t> relocation_i386_sizes {
{RELOC_i386::R_386_NONE, 0 },
{RELOC_i386::R_386_32, 32 },
{RELOC_i386::R_386_PC32, 32 },
{RELOC_i386::R_386_GOT32, 32 },
{RELOC_i386::R_386_PLT32, 32 },
{RELOC_i386::R_386_COPY, 32 },
{RELOC_i386::R_386_GLOB_DAT, 32 },
{RELOC_i386::R_386_JUMP_SLOT, 32 },
{RELOC_i386::R_386_RELATIVE, 32 },
{RELOC_i386::R_386_GOTOFF, 32 },
{RELOC_i386::R_386_GOTPC, 32 },
{RELOC_i386::R_386_32PLT, 32 },
{RELOC_i386::R_386_TLS_TPOFF, 32 },
{RELOC_i386::R_386_TLS_IE, 32 },
{RELOC_i386::R_386_TLS_GOTIE, 32 },
{RELOC_i386::R_386_TLS_LE, 32 },
{RELOC_i386::R_386_TLS_GD, 32 },
{RELOC_i386::R_386_TLS_LDM, 32 },
{RELOC_i386::R_386_16, 16 },
{RELOC_i386::R_386_PC16, 16 },
{RELOC_i386::R_386_8, 8 },
{RELOC_i386::R_386_PC8, 8 },
{RELOC_i386::R_386_TLS_GD_32, 32 },
{RELOC_i386::R_386_TLS_GD_PUSH, 32 },
{RELOC_i386::R_386_TLS_GD_CALL, 32 },
{RELOC_i386::R_386_TLS_GD_POP, 32 },
{RELOC_i386::R_386_TLS_LDM_32, 32 },
{RELOC_i386::R_386_TLS_LDM_PUSH, 32 },
{RELOC_i386::R_386_TLS_LDM_CALL, 0 },
{RELOC_i386::R_386_TLS_LDM_POP, 32 },
{RELOC_i386::R_386_TLS_LDO_32, 32 },
{RELOC_i386::R_386_TLS_IE_32, 32 },
{RELOC_i386::R_386_TLS_LE_32, 32 },
{RELOC_i386::R_386_TLS_DTPMOD32, 32 },
{RELOC_i386::R_386_TLS_DTPOFF32, 32 },
{RELOC_i386::R_386_TLS_TPOFF32, 32 },
{RELOC_i386::R_386_TLS_GOTDESC, 32 },
{RELOC_i386::R_386_TLS_DESC_CALL, 32 },
{RELOC_i386::R_386_TLS_DESC, 32 },
{RELOC_i386::R_386_IRELATIVE, 32 },
};
// From https://github.com/gittup/binutils/blob/gittup/bfd/elf32-arm.c#L75
static const std::map<RELOC_ARM, uint32_t> relocation_ARM_sizes {
{RELOC_ARM::R_ARM_NONE, 0 },
{RELOC_ARM::R_ARM_PC24, 24 },
{RELOC_ARM::R_ARM_ABS32, 32 },
{RELOC_ARM::R_ARM_REL32, 32 },
{RELOC_ARM::R_ARM_LDR_PC_G0, 32 },
{RELOC_ARM::R_ARM_ABS16, 16 },
{RELOC_ARM::R_ARM_ABS12, 12 },
{RELOC_ARM::R_ARM_THM_ABS5, 5 },
{RELOC_ARM::R_ARM_ABS8, 8 },
{RELOC_ARM::R_ARM_SBREL32, 32 },
{RELOC_ARM::R_ARM_THM_CALL, 25 },
{RELOC_ARM::R_ARM_THM_PC8, 8 },
{RELOC_ARM::R_ARM_BREL_ADJ, 32 },
{RELOC_ARM::R_ARM_TLS_DESC, 0 },
{RELOC_ARM::R_ARM_THM_SWI8, 0 },
{RELOC_ARM::R_ARM_XPC25, 25 },
{RELOC_ARM::R_ARM_THM_XPC22, 22 },
{RELOC_ARM::R_ARM_TLS_DTPMOD32, 32 },
{RELOC_ARM::R_ARM_TLS_DTPOFF32, 32 },
{RELOC_ARM::R_ARM_TLS_TPOFF32, 32 },
{RELOC_ARM::R_ARM_COPY, 32 },
{RELOC_ARM::R_ARM_GLOB_DAT, 32 },
{RELOC_ARM::R_ARM_JUMP_SLOT, 32 },
{RELOC_ARM::R_ARM_RELATIVE, 32 },
{RELOC_ARM::R_ARM_GOTOFF32, 32 },
{RELOC_ARM::R_ARM_BASE_PREL, 32 },
{RELOC_ARM::R_ARM_GOT_BREL, 32 },
{RELOC_ARM::R_ARM_PLT32, 24 },
{RELOC_ARM::R_ARM_CALL, 24 },
{RELOC_ARM::R_ARM_JUMP24, 24 },
{RELOC_ARM::R_ARM_THM_JUMP24, 24 },
{RELOC_ARM::R_ARM_BASE_ABS, 21 },
{RELOC_ARM::R_ARM_ALU_PCREL_7_0, 12 },
{RELOC_ARM::R_ARM_ALU_PCREL_15_8, 12 },
{RELOC_ARM::R_ARM_ALU_PCREL_23_15, 12 },
{RELOC_ARM::R_ARM_LDR_SBREL_11_0_NC, 12 },
{RELOC_ARM::R_ARM_ALU_SBREL_19_12_NC, 8 },
{RELOC_ARM::R_ARM_ALU_SBREL_27_20_CK, 8 },
{RELOC_ARM::R_ARM_TARGET1, 32 },
{RELOC_ARM::R_ARM_SBREL31, 32 },
{RELOC_ARM::R_ARM_V4BX, 32 },
{RELOC_ARM::R_ARM_TARGET2, 32 },
{RELOC_ARM::R_ARM_PREL31, 31 },
{RELOC_ARM::R_ARM_MOVW_ABS_NC, 16 },
{RELOC_ARM::R_ARM_MOVT_ABS, 16 },
{RELOC_ARM::R_ARM_MOVW_PREL_NC, 16 },
{RELOC_ARM::R_ARM_MOVT_PREL, 16 },
{RELOC_ARM::R_ARM_THM_MOVW_ABS_NC, 16 },
{RELOC_ARM::R_ARM_THM_MOVT_ABS, 16 },
{RELOC_ARM::R_ARM_THM_MOVW_PREL_NC, 16 },
{RELOC_ARM::R_ARM_THM_MOVT_PREL, 16 },
{RELOC_ARM::R_ARM_THM_JUMP19, 19 },
{RELOC_ARM::R_ARM_THM_JUMP6, 6 },
{RELOC_ARM::R_ARM_THM_ALU_PREL_11_0, 13 },
{RELOC_ARM::R_ARM_THM_PC12, 13 },
{RELOC_ARM::R_ARM_ABS32_NOI, 32 },
{RELOC_ARM::R_ARM_REL32_NOI, 32 },
{RELOC_ARM::R_ARM_ALU_PC_G0_NC, 32 },
{RELOC_ARM::R_ARM_ALU_PC_G0, 32 },
{RELOC_ARM::R_ARM_ALU_PC_G1_NC, 32 },
{RELOC_ARM::R_ARM_ALU_PC_G1, 32 },
{RELOC_ARM::R_ARM_ALU_PC_G2, 32 },
{RELOC_ARM::R_ARM_LDR_PC_G1, 32 },
{RELOC_ARM::R_ARM_LDR_PC_G2, 32 },
{RELOC_ARM::R_ARM_LDRS_PC_G0, 32 },
{RELOC_ARM::R_ARM_LDRS_PC_G1, 32 },
{RELOC_ARM::R_ARM_LDRS_PC_G2, 32 },
{RELOC_ARM::R_ARM_LDC_PC_G0, 32 },
{RELOC_ARM::R_ARM_LDC_PC_G1, 32 },
{RELOC_ARM::R_ARM_LDC_PC_G2, 32 },
{RELOC_ARM::R_ARM_ALU_SB_G0_NC, 32 },
{RELOC_ARM::R_ARM_ALU_SB_G0, 32 },
{RELOC_ARM::R_ARM_ALU_SB_G1_NC, 32 },
{RELOC_ARM::R_ARM_ALU_SB_G1, 32 },
{RELOC_ARM::R_ARM_ALU_SB_G2, 32 },
{RELOC_ARM::R_ARM_LDR_SB_G0, 32 },
{RELOC_ARM::R_ARM_LDR_SB_G1, 32 },
{RELOC_ARM::R_ARM_LDR_SB_G2, 32 },
{RELOC_ARM::R_ARM_LDRS_SB_G0, 32 },
{RELOC_ARM::R_ARM_LDRS_SB_G1, 32 },
{RELOC_ARM::R_ARM_LDRS_SB_G2, 32 },
{RELOC_ARM::R_ARM_LDC_SB_G0, 32 },
{RELOC_ARM::R_ARM_LDC_SB_G1, 32 },
{RELOC_ARM::R_ARM_LDC_SB_G2, 32 },
{RELOC_ARM::R_ARM_MOVW_BREL_NC, 16 },
{RELOC_ARM::R_ARM_MOVT_BREL, 16 },
{RELOC_ARM::R_ARM_MOVW_BREL, 16 },
{RELOC_ARM::R_ARM_THM_MOVW_BREL_NC, 16 },
{RELOC_ARM::R_ARM_THM_MOVT_BREL, 16 },
{RELOC_ARM::R_ARM_THM_MOVW_BREL, 16 },
{RELOC_ARM::R_ARM_TLS_GOTDESC, 0 },
{RELOC_ARM::R_ARM_TLS_CALL, 0 },
{RELOC_ARM::R_ARM_TLS_DESCSEQ, 0 },
{RELOC_ARM::R_ARM_THM_TLS_CALL, 0 },
{RELOC_ARM::R_ARM_PLT32_ABS, 32 },
{RELOC_ARM::R_ARM_GOT_ABS, 32 },
{RELOC_ARM::R_ARM_GOT_PREL, 32 },
{RELOC_ARM::R_ARM_GOT_BREL12, 12 },
{RELOC_ARM::R_ARM_GOTOFF12, 12 },
{RELOC_ARM::R_ARM_GOTRELAX, 12 },
{RELOC_ARM::R_ARM_GNU_VTENTRY, 0 },
{RELOC_ARM::R_ARM_GNU_VTINHERIT, 0 },
{RELOC_ARM::R_ARM_THM_JUMP11, 11 },
{RELOC_ARM::R_ARM_THM_JUMP8, 8 },
{RELOC_ARM::R_ARM_TLS_GD32, 32 },
{RELOC_ARM::R_ARM_TLS_LDM32, 32 },
{RELOC_ARM::R_ARM_TLS_LDO32, 32 },
{RELOC_ARM::R_ARM_TLS_IE32, 32 },
{RELOC_ARM::R_ARM_TLS_LE32, 32 },
{RELOC_ARM::R_ARM_TLS_LDO12, 12 },
{RELOC_ARM::R_ARM_TLS_LE12, 12 },
{RELOC_ARM::R_ARM_TLS_IE12GP, 12 },
{RELOC_ARM::R_ARM_PRIVATE_0, 0 },
{RELOC_ARM::R_ARM_PRIVATE_1, 0 },
{RELOC_ARM::R_ARM_PRIVATE_2, 0 },
{RELOC_ARM::R_ARM_PRIVATE_3, 0 },
{RELOC_ARM::R_ARM_PRIVATE_4, 0 },
{RELOC_ARM::R_ARM_PRIVATE_5, 0 },
{RELOC_ARM::R_ARM_PRIVATE_6, 0 },
{RELOC_ARM::R_ARM_PRIVATE_7, 0 },
{RELOC_ARM::R_ARM_PRIVATE_8, 0 },
{RELOC_ARM::R_ARM_PRIVATE_9, 0 },
{RELOC_ARM::R_ARM_PRIVATE_10, 0 },
{RELOC_ARM::R_ARM_PRIVATE_11, 0 },
{RELOC_ARM::R_ARM_PRIVATE_12, 0 },
{RELOC_ARM::R_ARM_PRIVATE_13, 0 },
{RELOC_ARM::R_ARM_PRIVATE_14, 0 },
{RELOC_ARM::R_ARM_PRIVATE_15, 0 },
{RELOC_ARM::R_ARM_ME_TOO, 0 },
{RELOC_ARM::R_ARM_THM_TLS_DESCSEQ16, 0 },
{RELOC_ARM::R_ARM_THM_TLS_DESCSEQ32, 0 },
{RELOC_ARM::R_ARM_IRELATIVE, 0 },
{RELOC_ARM::R_ARM_RXPC25, 25 },
{RELOC_ARM::R_ARM_RSBREL32, 32 },
{RELOC_ARM::R_ARM_THM_RPC22, 22 },
{RELOC_ARM::R_ARM_RREL32, 32 },
{RELOC_ARM::R_ARM_RPC24, 24 },
{RELOC_ARM::R_ARM_RBASE, 0 },
};
static const std::map<RELOC_AARCH64, uint32_t> relocation_AARCH64_sizes {
{ RELOC_AARCH64::R_AARCH64_NONE, 0 },
{ RELOC_AARCH64::R_AARCH64_ABS64, 64 },
{ RELOC_AARCH64::R_AARCH64_ABS32, 32 },
{ RELOC_AARCH64::R_AARCH64_ABS16, 16 },
{ RELOC_AARCH64::R_AARCH64_PREL64, 64 },
{ RELOC_AARCH64::R_AARCH64_PREL32, 32 },
{ RELOC_AARCH64::R_AARCH64_PREL16, 16 },
{ RELOC_AARCH64::R_AARCH64_MOVW_UABS_G0, 16 },
{ RELOC_AARCH64::R_AARCH64_MOVW_UABS_G0_NC, 16 },
{ RELOC_AARCH64::R_AARCH64_MOVW_UABS_G1, 16 },
{ RELOC_AARCH64::R_AARCH64_MOVW_UABS_G1_NC, 16 },
{ RELOC_AARCH64::R_AARCH64_MOVW_UABS_G2, 16 },
{ RELOC_AARCH64::R_AARCH64_MOVW_UABS_G2_NC, 16 },
{ RELOC_AARCH64::R_AARCH64_MOVW_UABS_G3, 16 },
{ RELOC_AARCH64::R_AARCH64_MOVW_SABS_G0, 16 },
{ RELOC_AARCH64::R_AARCH64_MOVW_SABS_G1, 16 },
{ RELOC_AARCH64::R_AARCH64_MOVW_SABS_G2, 16 },
{ RELOC_AARCH64::R_AARCH64_LD_PREL_LO19, 19 },
{ RELOC_AARCH64::R_AARCH64_ADR_PREL_LO21, 21 },
{ RELOC_AARCH64::R_AARCH64_ADR_PREL_PG_HI21, 21 },
{ RELOC_AARCH64::R_AARCH64_ADR_PREL_PG_HI21_NC, 21 },
{ RELOC_AARCH64::R_AARCH64_ADD_ABS_LO12_NC, 12 },
{ RELOC_AARCH64::R_AARCH64_LDST8_ABS_LO12_NC, 12 },
{ RELOC_AARCH64::R_AARCH64_TSTBR14, 14 },
{ RELOC_AARCH64::R_AARCH64_CONDBR19, 19 },
{ RELOC_AARCH64::R_AARCH64_JUMP26, 26 },
{ RELOC_AARCH64::R_AARCH64_CALL26, 26 },
{ RELOC_AARCH64::R_AARCH64_LDST16_ABS_LO12_NC, 12 },
{ RELOC_AARCH64::R_AARCH64_LDST32_ABS_LO12_NC, 12 },
{ RELOC_AARCH64::R_AARCH64_LDST64_ABS_LO12_NC, 12 },
{ RELOC_AARCH64::R_AARCH64_MOVW_PREL_G0, 16 },
{ RELOC_AARCH64::R_AARCH64_MOVW_PREL_G0_NC, 16 },
{ RELOC_AARCH64::R_AARCH64_MOVW_PREL_G1, 16 },
{ RELOC_AARCH64::R_AARCH64_MOVW_PREL_G1_NC, 16 },
{ RELOC_AARCH64::R_AARCH64_MOVW_PREL_G2, 16 },
{ RELOC_AARCH64::R_AARCH64_MOVW_PREL_G2_NC, 16 },
{ RELOC_AARCH64::R_AARCH64_MOVW_PREL_G3, 16 },
{ RELOC_AARCH64::R_AARCH64_LDST128_ABS_LO12_NC, 12 },
{ RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G0, 16 },
{ RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G0_NC, 16 },
{ RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G1, 16 },
{ RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G1_NC, 16 },
{ RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G2, 16 },
{ RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G2_NC, 16 },
{ RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G3, 16 },
{ RELOC_AARCH64::R_AARCH64_GOTREL64, 64 },
{ RELOC_AARCH64::R_AARCH64_GOTREL32, 64 },
{ RELOC_AARCH64::R_AARCH64_GOT_LD_PREL19, 19 },
{ RELOC_AARCH64::R_AARCH64_LD64_GOTOFF_LO15, 15 },
{ RELOC_AARCH64::R_AARCH64_ADR_GOT_PAGE, 21 },
{ RELOC_AARCH64::R_AARCH64_LD64_GOT_LO12_NC, 12 },
{ RELOC_AARCH64::R_AARCH64_LD64_GOTPAGE_LO15, 15 },
{ RELOC_AARCH64::R_AARCH64_TLSGD_ADR_PREL21, 21 },
{ RELOC_AARCH64::R_AARCH64_TLSGD_ADR_PAGE21, 21 },
{ RELOC_AARCH64::R_AARCH64_TLSGD_ADD_LO12_NC, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSGD_MOVW_G1, 16 },
{ RELOC_AARCH64::R_AARCH64_TLSGD_MOVW_G0_NC, 16 },
{ RELOC_AARCH64::R_AARCH64_TLSLD_ADR_PREL21, 21 },
{ RELOC_AARCH64::R_AARCH64_TLSLD_ADR_PAGE21, 21 },
{ RELOC_AARCH64::R_AARCH64_TLSLD_ADD_LO12_NC, 0 },
{ RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_G1, 0 },
{ RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_G0_NC, 0 },
{ RELOC_AARCH64::R_AARCH64_TLSLD_LD_PREL19, 19 },
{ RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_DTPREL_G2, 16 },
{ RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_DTPREL_G1, 16 },
{ RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC, 16 },
{ RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_DTPREL_G0, 16 },
{ RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC, 16 },
{ RELOC_AARCH64::R_AARCH64_TLSLD_ADD_DTPREL_HI12, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSLD_ADD_DTPREL_LO12, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSLD_LDST8_DTPREL_LO12, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSLD_LDST16_DTPREL_LO12, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSLD_LDST32_DTPREL_LO12, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSLD_LDST64_DTPREL_LO12, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSIE_MOVW_GOTTPREL_G1, 16 },
{ RELOC_AARCH64::R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC, 16 },
{ RELOC_AARCH64::R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21, 21 },
{ RELOC_AARCH64::R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSIE_LD_GOTTPREL_PREL19, 19 },
{ RELOC_AARCH64::R_AARCH64_TLSLE_MOVW_TPREL_G2, 16 },
{ RELOC_AARCH64::R_AARCH64_TLSLE_MOVW_TPREL_G1, 16 },
{ RELOC_AARCH64::R_AARCH64_TLSLE_MOVW_TPREL_G1_NC, 16 },
{ RELOC_AARCH64::R_AARCH64_TLSLE_MOVW_TPREL_G0, 16 },
{ RELOC_AARCH64::R_AARCH64_TLSLE_MOVW_TPREL_G0_NC, 16 },
{ RELOC_AARCH64::R_AARCH64_TLSLE_ADD_TPREL_HI12, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSLE_ADD_TPREL_LO12, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSLE_ADD_TPREL_LO12_NC, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSLE_LDST8_TPREL_LO12, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSLE_LDST16_TPREL_LO12, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSLE_LDST32_TPREL_LO12, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSLE_LDST64_TPREL_LO12, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSDESC_LD_PREL19, 19 },
{ RELOC_AARCH64::R_AARCH64_TLSDESC_ADR_PREL21, 21 },
{ RELOC_AARCH64::R_AARCH64_TLSDESC_ADR_PAGE21, 21 },
{ RELOC_AARCH64::R_AARCH64_TLSDESC_LD64_LO12_NC, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSDESC_ADD_LO12_NC, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSDESC_OFF_G1, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSDESC_OFF_G0_NC, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSDESC_LDR, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSDESC_ADD, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSDESC_CALL, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSLE_LDST128_TPREL_LO12, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSLD_LDST128_DTPREL_LO12, 12 },
{ RELOC_AARCH64::R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC, 12 },
{ RELOC_AARCH64::R_AARCH64_COPY, 64 },
{ RELOC_AARCH64::R_AARCH64_GLOB_DAT, 64 },
{ RELOC_AARCH64::R_AARCH64_JUMP_SLOT, 64 },
{ RELOC_AARCH64::R_AARCH64_RELATIVE, 64 },
{ RELOC_AARCH64::R_AARCH64_TLS_DTPREL64, 64 },
{ RELOC_AARCH64::R_AARCH64_TLS_DTPMOD64, 64 },
{ RELOC_AARCH64::R_AARCH64_TLS_TPREL64, 64 },
{ RELOC_AARCH64::R_AARCH64_TLSDESC, 64 },
{ RELOC_AARCH64::R_AARCH64_IRELATIVE, 64 },
};
}
}
#endif

View File

@ -136,3 +136,10 @@ ELF_RELOC(R_ARM_ME_TOO, 0x80)
ELF_RELOC(R_ARM_THM_TLS_DESCSEQ16, 0x81)
ELF_RELOC(R_ARM_THM_TLS_DESCSEQ32, 0x82)
ELF_RELOC(R_ARM_IRELATIVE, 0xa0)
ELF_RELOC(R_ARM_RXPC25, 0xF9)
ELF_RELOC(R_ARM_RSBREL32, 0xFA)
ELF_RELOC(R_ARM_THM_RPC22, 0xFB)
ELF_RELOC(R_ARM_RREL32, 0xFC)
ELF_RELOC(R_ARM_RPC24, 0xFD)
ELF_RELOC(R_ARM_RBASE, 0xFE)

View File

@ -280,7 +280,7 @@ enum RELOC_i386 {
};
/* ELF Relocation types for PPC32 */
enum {
enum RELOC_POWERPC32 {
#include "LIEF/ELF/Relocations/PowerPC.def"
};
@ -300,12 +300,12 @@ enum {
};
/* ELF Relocation types for PPC64 */
enum {
enum RELOC_POWERPC64 {
#include "LIEF/ELF/Relocations/PowerPC64.def"
};
/* ELF Relocation types for AArch64 */
enum {
enum RELOC_AARCH64 {
#include "LIEF/ELF/Relocations/AArch64.def"
};
@ -391,7 +391,7 @@ enum {
};
/* ELF Relocation types for Mips */
enum {
enum RELOC_MIPS {
#include "LIEF/ELF/Relocations/Mips.def"
};
@ -449,17 +449,17 @@ enum {
};
/* ELF Relocation types for Hexagon */
enum {
enum RELOC_HEXAGON {
#include "LIEF/ELF/Relocations/Hexagon.def"
};
/* ELF Relocation types for S390/zSeries */
enum {
enum RELOC_SYSTEMZ {
#include "LIEF/ELF/Relocations/SystemZ.def"
};
/* ELF Relocation type for Sparc. */
enum {
enum RELOC_SPARC {
#include "LIEF/ELF/Relocations/Sparc.def"
};

View File

@ -59,6 +59,7 @@ set(LIEF_ELF_INC_FILES
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/ELF/Header.hpp"
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/ELF/Parser.hpp"
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/ELF/Relocation.hpp"
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/ELF/RelocationSizes.hpp"
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/ELF/Section.hpp"
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/ELF/Segment.hpp"
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/ELF/Symbol.hpp"

View File

@ -518,138 +518,275 @@ const char* to_string(RELOC_x86_64 e) {
const char* to_string(RELOC_ARM e) {
const std::map<RELOC_ARM, const char*> enumStrings {
{ RELOC_ARM::R_ARM_NONE, "NONE"},
{ RELOC_ARM::R_ARM_PC24, "PC24"},
{ RELOC_ARM::R_ARM_ABS32, "ABS32"},
{ RELOC_ARM::R_ARM_REL32, "REL32"},
{ RELOC_ARM::R_ARM_LDR_PC_G0, "LDR_PC_G0"},
{ RELOC_ARM::R_ARM_ABS16, "ABS16"},
{ RELOC_ARM::R_ARM_ABS12, "ABS12"},
{ RELOC_ARM::R_ARM_THM_ABS5, "THM_ABS5"},
{ RELOC_ARM::R_ARM_ABS8, "ABS8"},
{ RELOC_ARM::R_ARM_SBREL32, "SBREL32"},
{ RELOC_ARM::R_ARM_THM_CALL, "THM_CALL"},
{ RELOC_ARM::R_ARM_THM_PC8, "THM_PC8"},
{ RELOC_ARM::R_ARM_BREL_ADJ, "BREL_ADJ"},
{ RELOC_ARM::R_ARM_TLS_DESC, "TLS_DESC"},
{ RELOC_ARM::R_ARM_THM_SWI8, "THM_SWI8"},
{ RELOC_ARM::R_ARM_XPC25, "XPC25"},
{ RELOC_ARM::R_ARM_THM_XPC22, "THM_XPC22"},
{ RELOC_ARM::R_ARM_TLS_DTPMOD32, "TLS_DTPMOD32"},
{ RELOC_ARM::R_ARM_TLS_DTPOFF32, "TLS_DTPOFF32"},
{ RELOC_ARM::R_ARM_TLS_TPOFF32, "TLS_TPOFF32"},
{ RELOC_ARM::R_ARM_COPY, "COPY"},
{ RELOC_ARM::R_ARM_GLOB_DAT, "GLOB_DAT"},
{ RELOC_ARM::R_ARM_JUMP_SLOT, "JUMP_SLOT"},
{ RELOC_ARM::R_ARM_RELATIVE, "RELATIVE"},
{ RELOC_ARM::R_ARM_GOTOFF32, "GOTOFF32"},
{ RELOC_ARM::R_ARM_BASE_PREL, "BASE_PREL"},
{ RELOC_ARM::R_ARM_GOT_BREL, "GOT_BREL"},
{ RELOC_ARM::R_ARM_PLT32, "PLT32"},
{ RELOC_ARM::R_ARM_CALL, "CALL"},
{ RELOC_ARM::R_ARM_JUMP24, "JUMP24"},
{ RELOC_ARM::R_ARM_THM_JUMP24, "THM_JUMP24"},
{ RELOC_ARM::R_ARM_BASE_ABS, "BASE_ABS"},
{ RELOC_ARM::R_ARM_ALU_PCREL_7_0, "ALU_PCREL_7_0"},
{ RELOC_ARM::R_ARM_ALU_PCREL_15_8, "ALU_PCREL_15_8"},
{ RELOC_ARM::R_ARM_ALU_PCREL_23_15, "ALU_PCREL_23_15"},
{ RELOC_ARM::R_ARM_LDR_SBREL_11_0_NC, "LDR_SBREL_11_0_NC"},
{ RELOC_ARM::R_ARM_NONE, "NONE"},
{ RELOC_ARM::R_ARM_PC24, "PC24"},
{ RELOC_ARM::R_ARM_ABS32, "ABS32"},
{ RELOC_ARM::R_ARM_REL32, "REL32"},
{ RELOC_ARM::R_ARM_LDR_PC_G0, "LDR_PC_G0"},
{ RELOC_ARM::R_ARM_ABS16, "ABS16"},
{ RELOC_ARM::R_ARM_ABS12, "ABS12"},
{ RELOC_ARM::R_ARM_THM_ABS5, "THM_ABS5"},
{ RELOC_ARM::R_ARM_ABS8, "ABS8"},
{ RELOC_ARM::R_ARM_SBREL32, "SBREL32"},
{ RELOC_ARM::R_ARM_THM_CALL, "THM_CALL"},
{ RELOC_ARM::R_ARM_THM_PC8, "THM_PC8"},
{ RELOC_ARM::R_ARM_BREL_ADJ, "BREL_ADJ"},
{ RELOC_ARM::R_ARM_TLS_DESC, "TLS_DESC"},
{ RELOC_ARM::R_ARM_THM_SWI8, "THM_SWI8"},
{ RELOC_ARM::R_ARM_XPC25, "XPC25"},
{ RELOC_ARM::R_ARM_THM_XPC22, "THM_XPC22"},
{ RELOC_ARM::R_ARM_TLS_DTPMOD32, "TLS_DTPMOD32"},
{ RELOC_ARM::R_ARM_TLS_DTPOFF32, "TLS_DTPOFF32"},
{ RELOC_ARM::R_ARM_TLS_TPOFF32, "TLS_TPOFF32"},
{ RELOC_ARM::R_ARM_COPY, "COPY"},
{ RELOC_ARM::R_ARM_GLOB_DAT, "GLOB_DAT"},
{ RELOC_ARM::R_ARM_JUMP_SLOT, "JUMP_SLOT"},
{ RELOC_ARM::R_ARM_RELATIVE, "RELATIVE"},
{ RELOC_ARM::R_ARM_GOTOFF32, "GOTOFF32"},
{ RELOC_ARM::R_ARM_BASE_PREL, "BASE_PREL"},
{ RELOC_ARM::R_ARM_GOT_BREL, "GOT_BREL"},
{ RELOC_ARM::R_ARM_PLT32, "PLT32"},
{ RELOC_ARM::R_ARM_CALL, "CALL"},
{ RELOC_ARM::R_ARM_JUMP24, "JUMP24"},
{ RELOC_ARM::R_ARM_THM_JUMP24, "THM_JUMP24"},
{ RELOC_ARM::R_ARM_BASE_ABS, "BASE_ABS"},
{ RELOC_ARM::R_ARM_ALU_PCREL_7_0, "ALU_PCREL_7_0"},
{ RELOC_ARM::R_ARM_ALU_PCREL_15_8, "ALU_PCREL_15_8"},
{ RELOC_ARM::R_ARM_ALU_PCREL_23_15, "ALU_PCREL_23_15"},
{ RELOC_ARM::R_ARM_LDR_SBREL_11_0_NC, "LDR_SBREL_11_0_NC"},
{ RELOC_ARM::R_ARM_ALU_SBREL_19_12_NC, "ALU_SBREL_19_12_NC"},
{ RELOC_ARM::R_ARM_ALU_SBREL_27_20_CK, "ALU_SBREL_27_20_CK"},
{ RELOC_ARM::R_ARM_TARGET1, "TARGET1"},
{ RELOC_ARM::R_ARM_SBREL31, "SBREL31"},
{ RELOC_ARM::R_ARM_V4BX, "V4BX"},
{ RELOC_ARM::R_ARM_TARGET2, "TARGET2"},
{ RELOC_ARM::R_ARM_PREL31, "PREL31"},
{ RELOC_ARM::R_ARM_MOVW_ABS_NC, "MOVW_ABS_NC"},
{ RELOC_ARM::R_ARM_MOVT_ABS, "MOVT_ABS"},
{ RELOC_ARM::R_ARM_MOVW_PREL_NC, "MOVW_PREL_NC"},
{ RELOC_ARM::R_ARM_MOVT_PREL, "MOVT_PREL"},
{ RELOC_ARM::R_ARM_THM_MOVW_ABS_NC, "THM_MOVW_ABS_NC"},
{ RELOC_ARM::R_ARM_THM_MOVT_ABS, "THM_MOVT_ABS"},
{ RELOC_ARM::R_ARM_THM_MOVW_PREL_NC, "THM_MOVW_PREL_NC"},
{ RELOC_ARM::R_ARM_THM_MOVT_PREL, "THM_MOVT_PREL"},
{ RELOC_ARM::R_ARM_THM_JUMP19, "THM_JUMP19"},
{ RELOC_ARM::R_ARM_THM_JUMP6, "THM_JUMP6"},
{ RELOC_ARM::R_ARM_THM_ALU_PREL_11_0, "THM_ALU_PREL_11_0"},
{ RELOC_ARM::R_ARM_THM_PC12, "THM_PC12"},
{ RELOC_ARM::R_ARM_ABS32_NOI, "ABS32_NOI"},
{ RELOC_ARM::R_ARM_REL32_NOI, "REL32_NOI"},
{ RELOC_ARM::R_ARM_ALU_PC_G0_NC, "ALU_PC_G0_NC"},
{ RELOC_ARM::R_ARM_ALU_PC_G0, "ALU_PC_G0"},
{ RELOC_ARM::R_ARM_ALU_PC_G1_NC, "ALU_PC_G1_NC"},
{ RELOC_ARM::R_ARM_ALU_PC_G1, "ALU_PC_G1"},
{ RELOC_ARM::R_ARM_ALU_PC_G2, "ALU_PC_G2"},
{ RELOC_ARM::R_ARM_LDR_PC_G1, "LDR_PC_G1"},
{ RELOC_ARM::R_ARM_LDR_PC_G2, "LDR_PC_G2"},
{ RELOC_ARM::R_ARM_LDRS_PC_G0, "LDRS_PC_G0"},
{ RELOC_ARM::R_ARM_LDRS_PC_G1, "LDRS_PC_G1"},
{ RELOC_ARM::R_ARM_LDRS_PC_G2, "LDRS_PC_G2"},
{ RELOC_ARM::R_ARM_LDC_PC_G0, "LDC_PC_G0"},
{ RELOC_ARM::R_ARM_LDC_PC_G1, "LDC_PC_G1"},
{ RELOC_ARM::R_ARM_LDC_PC_G2, "LDC_PC_G2"},
{ RELOC_ARM::R_ARM_ALU_SB_G0_NC, "ALU_SB_G0_NC"},
{ RELOC_ARM::R_ARM_ALU_SB_G0, "ALU_SB_G0"},
{ RELOC_ARM::R_ARM_ALU_SB_G1_NC, "ALU_SB_G1_NC"},
{ RELOC_ARM::R_ARM_ALU_SB_G1, "ALU_SB_G1"},
{ RELOC_ARM::R_ARM_ALU_SB_G2, "ALU_SB_G2"},
{ RELOC_ARM::R_ARM_LDR_SB_G0, "LDR_SB_G0"},
{ RELOC_ARM::R_ARM_LDR_SB_G1, "LDR_SB_G1"},
{ RELOC_ARM::R_ARM_LDR_SB_G2, "LDR_SB_G2"},
{ RELOC_ARM::R_ARM_LDRS_SB_G0, "LDRS_SB_G0"},
{ RELOC_ARM::R_ARM_LDRS_SB_G1, "LDRS_SB_G1"},
{ RELOC_ARM::R_ARM_LDRS_SB_G2, "LDRS_SB_G2"},
{ RELOC_ARM::R_ARM_LDC_SB_G0, "LDC_SB_G0"},
{ RELOC_ARM::R_ARM_LDC_SB_G1, "LDC_SB_G1"},
{ RELOC_ARM::R_ARM_LDC_SB_G2, "LDC_SB_G2"},
{ RELOC_ARM::R_ARM_MOVW_BREL_NC, "MOVW_BREL_NC"},
{ RELOC_ARM::R_ARM_MOVT_BREL, "MOVT_BREL"},
{ RELOC_ARM::R_ARM_MOVW_BREL, "MOVW_BREL"},
{ RELOC_ARM::R_ARM_THM_MOVW_BREL_NC, "THM_MOVW_BREL_NC"},
{ RELOC_ARM::R_ARM_THM_MOVT_BREL, "THM_MOVT_BREL"},
{ RELOC_ARM::R_ARM_THM_MOVW_BREL, "THM_MOVW_BREL"},
{ RELOC_ARM::R_ARM_TLS_GOTDESC, "TLS_GOTDESC"},
{ RELOC_ARM::R_ARM_TLS_CALL, "TLS_CALL"},
{ RELOC_ARM::R_ARM_TLS_DESCSEQ, "TLS_DESCSEQ"},
{ RELOC_ARM::R_ARM_THM_TLS_CALL, "THM_TLS_CALL"},
{ RELOC_ARM::R_ARM_PLT32_ABS, "PLT32_ABS"},
{ RELOC_ARM::R_ARM_GOT_ABS, "GOT_ABS"},
{ RELOC_ARM::R_ARM_GOT_PREL, "GOT_PREL"},
{ RELOC_ARM::R_ARM_GOT_BREL12, "GOT_BREL12"},
{ RELOC_ARM::R_ARM_GOTOFF12, "GOTOFF12"},
{ RELOC_ARM::R_ARM_GOTRELAX, "GOTRELAX"},
{ RELOC_ARM::R_ARM_GNU_VTENTRY, "GNU_VTENTRY"},
{ RELOC_ARM::R_ARM_GNU_VTINHERIT, "GNU_VTINHERIT"},
{ RELOC_ARM::R_ARM_THM_JUMP11, "THM_JUMP11"},
{ RELOC_ARM::R_ARM_THM_JUMP8, "THM_JUMP8"},
{ RELOC_ARM::R_ARM_TLS_GD32, "TLS_GD32"},
{ RELOC_ARM::R_ARM_TLS_LDM32, "TLS_LDM32"},
{ RELOC_ARM::R_ARM_TLS_LDO32, "TLS_LDO32"},
{ RELOC_ARM::R_ARM_TLS_IE32, "TLS_IE32"},
{ RELOC_ARM::R_ARM_TLS_LE32, "TLS_LE32"},
{ RELOC_ARM::R_ARM_TLS_LDO12, "TLS_LDO12"},
{ RELOC_ARM::R_ARM_TLS_LE12, "TLS_LE12"},
{ RELOC_ARM::R_ARM_TLS_IE12GP, "TLS_IE12GP"},
{ RELOC_ARM::R_ARM_PRIVATE_0, "PRIVATE_0"},
{ RELOC_ARM::R_ARM_PRIVATE_1, "PRIVATE_1"},
{ RELOC_ARM::R_ARM_PRIVATE_2, "PRIVATE_2"},
{ RELOC_ARM::R_ARM_PRIVATE_3, "PRIVATE_3"},
{ RELOC_ARM::R_ARM_PRIVATE_4, "PRIVATE_4"},
{ RELOC_ARM::R_ARM_PRIVATE_5, "PRIVATE_5"},
{ RELOC_ARM::R_ARM_PRIVATE_6, "PRIVATE_6"},
{ RELOC_ARM::R_ARM_PRIVATE_7, "PRIVATE_7"},
{ RELOC_ARM::R_ARM_PRIVATE_8, "PRIVATE_8"},
{ RELOC_ARM::R_ARM_PRIVATE_9, "PRIVATE_9"},
{ RELOC_ARM::R_ARM_PRIVATE_10, "PRIVATE_10"},
{ RELOC_ARM::R_ARM_PRIVATE_11, "PRIVATE_11"},
{ RELOC_ARM::R_ARM_PRIVATE_12, "PRIVATE_12"},
{ RELOC_ARM::R_ARM_PRIVATE_13, "PRIVATE_13"},
{ RELOC_ARM::R_ARM_PRIVATE_14, "PRIVATE_14"},
{ RELOC_ARM::R_ARM_PRIVATE_15, "PRIVATE_15"},
{ RELOC_ARM::R_ARM_ME_TOO, "ME_TOO"},
{ RELOC_ARM::R_ARM_THM_TLS_DESCSEQ16, "THM_TLS_DESCSEQ16"},
{ RELOC_ARM::R_ARM_THM_TLS_DESCSEQ32, "THM_TLS_DESCSEQ32"},
{ RELOC_ARM::R_ARM_IRELATIVE, "IRELATIVE"}
{ RELOC_ARM::R_ARM_TARGET1, "TARGET1"},
{ RELOC_ARM::R_ARM_SBREL31, "SBREL31"},
{ RELOC_ARM::R_ARM_V4BX, "V4BX"},
{ RELOC_ARM::R_ARM_TARGET2, "TARGET2"},
{ RELOC_ARM::R_ARM_PREL31, "PREL31"},
{ RELOC_ARM::R_ARM_MOVW_ABS_NC, "MOVW_ABS_NC"},
{ RELOC_ARM::R_ARM_MOVT_ABS, "MOVT_ABS"},
{ RELOC_ARM::R_ARM_MOVW_PREL_NC, "MOVW_PREL_NC"},
{ RELOC_ARM::R_ARM_MOVT_PREL, "MOVT_PREL"},
{ RELOC_ARM::R_ARM_THM_MOVW_ABS_NC, "THM_MOVW_ABS_NC"},
{ RELOC_ARM::R_ARM_THM_MOVT_ABS, "THM_MOVT_ABS"},
{ RELOC_ARM::R_ARM_THM_MOVW_PREL_NC, "THM_MOVW_PREL_NC"},
{ RELOC_ARM::R_ARM_THM_MOVT_PREL, "THM_MOVT_PREL"},
{ RELOC_ARM::R_ARM_THM_JUMP19, "THM_JUMP19"},
{ RELOC_ARM::R_ARM_THM_JUMP6, "THM_JUMP6"},
{ RELOC_ARM::R_ARM_THM_ALU_PREL_11_0, "THM_ALU_PREL_11_0"},
{ RELOC_ARM::R_ARM_THM_PC12, "THM_PC12"},
{ RELOC_ARM::R_ARM_ABS32_NOI, "ABS32_NOI"},
{ RELOC_ARM::R_ARM_REL32_NOI, "REL32_NOI"},
{ RELOC_ARM::R_ARM_ALU_PC_G0_NC, "ALU_PC_G0_NC"},
{ RELOC_ARM::R_ARM_ALU_PC_G0, "ALU_PC_G0"},
{ RELOC_ARM::R_ARM_ALU_PC_G1_NC, "ALU_PC_G1_NC"},
{ RELOC_ARM::R_ARM_ALU_PC_G1, "ALU_PC_G1"},
{ RELOC_ARM::R_ARM_ALU_PC_G2, "ALU_PC_G2"},
{ RELOC_ARM::R_ARM_LDR_PC_G1, "LDR_PC_G1"},
{ RELOC_ARM::R_ARM_LDR_PC_G2, "LDR_PC_G2"},
{ RELOC_ARM::R_ARM_LDRS_PC_G0, "LDRS_PC_G0"},
{ RELOC_ARM::R_ARM_LDRS_PC_G1, "LDRS_PC_G1"},
{ RELOC_ARM::R_ARM_LDRS_PC_G2, "LDRS_PC_G2"},
{ RELOC_ARM::R_ARM_LDC_PC_G0, "LDC_PC_G0"},
{ RELOC_ARM::R_ARM_LDC_PC_G1, "LDC_PC_G1"},
{ RELOC_ARM::R_ARM_LDC_PC_G2, "LDC_PC_G2"},
{ RELOC_ARM::R_ARM_ALU_SB_G0_NC, "ALU_SB_G0_NC"},
{ RELOC_ARM::R_ARM_ALU_SB_G0, "ALU_SB_G0"},
{ RELOC_ARM::R_ARM_ALU_SB_G1_NC, "ALU_SB_G1_NC"},
{ RELOC_ARM::R_ARM_ALU_SB_G1, "ALU_SB_G1"},
{ RELOC_ARM::R_ARM_ALU_SB_G2, "ALU_SB_G2"},
{ RELOC_ARM::R_ARM_LDR_SB_G0, "LDR_SB_G0"},
{ RELOC_ARM::R_ARM_LDR_SB_G1, "LDR_SB_G1"},
{ RELOC_ARM::R_ARM_LDR_SB_G2, "LDR_SB_G2"},
{ RELOC_ARM::R_ARM_LDRS_SB_G0, "LDRS_SB_G0"},
{ RELOC_ARM::R_ARM_LDRS_SB_G1, "LDRS_SB_G1"},
{ RELOC_ARM::R_ARM_LDRS_SB_G2, "LDRS_SB_G2"},
{ RELOC_ARM::R_ARM_LDC_SB_G0, "LDC_SB_G0"},
{ RELOC_ARM::R_ARM_LDC_SB_G1, "LDC_SB_G1"},
{ RELOC_ARM::R_ARM_LDC_SB_G2, "LDC_SB_G2"},
{ RELOC_ARM::R_ARM_MOVW_BREL_NC, "MOVW_BREL_NC"},
{ RELOC_ARM::R_ARM_MOVT_BREL, "MOVT_BREL"},
{ RELOC_ARM::R_ARM_MOVW_BREL, "MOVW_BREL"},
{ RELOC_ARM::R_ARM_THM_MOVW_BREL_NC, "THM_MOVW_BREL_NC"},
{ RELOC_ARM::R_ARM_THM_MOVT_BREL, "THM_MOVT_BREL"},
{ RELOC_ARM::R_ARM_THM_MOVW_BREL, "THM_MOVW_BREL"},
{ RELOC_ARM::R_ARM_TLS_GOTDESC, "TLS_GOTDESC"},
{ RELOC_ARM::R_ARM_TLS_CALL, "TLS_CALL"},
{ RELOC_ARM::R_ARM_TLS_DESCSEQ, "TLS_DESCSEQ"},
{ RELOC_ARM::R_ARM_THM_TLS_CALL, "THM_TLS_CALL"},
{ RELOC_ARM::R_ARM_PLT32_ABS, "PLT32_ABS"},
{ RELOC_ARM::R_ARM_GOT_ABS, "GOT_ABS"},
{ RELOC_ARM::R_ARM_GOT_PREL, "GOT_PREL"},
{ RELOC_ARM::R_ARM_GOT_BREL12, "GOT_BREL12"},
{ RELOC_ARM::R_ARM_GOTOFF12, "GOTOFF12"},
{ RELOC_ARM::R_ARM_GOTRELAX, "GOTRELAX"},
{ RELOC_ARM::R_ARM_GNU_VTENTRY, "GNU_VTENTRY"},
{ RELOC_ARM::R_ARM_GNU_VTINHERIT, "GNU_VTINHERIT"},
{ RELOC_ARM::R_ARM_THM_JUMP11, "THM_JUMP11"},
{ RELOC_ARM::R_ARM_THM_JUMP8, "THM_JUMP8"},
{ RELOC_ARM::R_ARM_TLS_GD32, "TLS_GD32"},
{ RELOC_ARM::R_ARM_TLS_LDM32, "TLS_LDM32"},
{ RELOC_ARM::R_ARM_TLS_LDO32, "TLS_LDO32"},
{ RELOC_ARM::R_ARM_TLS_IE32, "TLS_IE32"},
{ RELOC_ARM::R_ARM_TLS_LE32, "TLS_LE32"},
{ RELOC_ARM::R_ARM_TLS_LDO12, "TLS_LDO12"},
{ RELOC_ARM::R_ARM_TLS_LE12, "TLS_LE12"},
{ RELOC_ARM::R_ARM_TLS_IE12GP, "TLS_IE12GP"},
{ RELOC_ARM::R_ARM_PRIVATE_0, "PRIVATE_0"},
{ RELOC_ARM::R_ARM_PRIVATE_1, "PRIVATE_1"},
{ RELOC_ARM::R_ARM_PRIVATE_2, "PRIVATE_2"},
{ RELOC_ARM::R_ARM_PRIVATE_3, "PRIVATE_3"},
{ RELOC_ARM::R_ARM_PRIVATE_4, "PRIVATE_4"},
{ RELOC_ARM::R_ARM_PRIVATE_5, "PRIVATE_5"},
{ RELOC_ARM::R_ARM_PRIVATE_6, "PRIVATE_6"},
{ RELOC_ARM::R_ARM_PRIVATE_7, "PRIVATE_7"},
{ RELOC_ARM::R_ARM_PRIVATE_8, "PRIVATE_8"},
{ RELOC_ARM::R_ARM_PRIVATE_9, "PRIVATE_9"},
{ RELOC_ARM::R_ARM_PRIVATE_10, "PRIVATE_10"},
{ RELOC_ARM::R_ARM_PRIVATE_11, "PRIVATE_11"},
{ RELOC_ARM::R_ARM_PRIVATE_12, "PRIVATE_12"},
{ RELOC_ARM::R_ARM_PRIVATE_13, "PRIVATE_13"},
{ RELOC_ARM::R_ARM_PRIVATE_14, "PRIVATE_14"},
{ RELOC_ARM::R_ARM_PRIVATE_15, "PRIVATE_15"},
{ RELOC_ARM::R_ARM_ME_TOO, "ME_TOO"},
{ RELOC_ARM::R_ARM_THM_TLS_DESCSEQ16, "THM_TLS_DESCSEQ16"},
{ RELOC_ARM::R_ARM_THM_TLS_DESCSEQ32, "THM_TLS_DESCSEQ32"},
{ RELOC_ARM::R_ARM_IRELATIVE, "IRELATIVE"},
{ RELOC_ARM::R_ARM_RXPC25, "RXPC25"},
{ RELOC_ARM::R_ARM_RSBREL32, "RSBREL32"},
{ RELOC_ARM::R_ARM_THM_RPC22, "THM_RPC22"},
{ RELOC_ARM::R_ARM_RREL32, "RREL32"},
{ RELOC_ARM::R_ARM_RPC24, "RPC24"},
{ RELOC_ARM::R_ARM_RBASE, "RBASE"},
};
auto it = enumStrings.find(e);
return it == enumStrings.end() ? "UNDEFINED" : it->second;
}
const char* to_string(RELOC_AARCH64 e) {
const std::map<RELOC_AARCH64, const char*> enumStrings {
{ RELOC_AARCH64::R_AARCH64_NONE, "NONE"},
{ RELOC_AARCH64::R_AARCH64_ABS64, "ABS64"},
{ RELOC_AARCH64::R_AARCH64_ABS32, "ABS32"},
{ RELOC_AARCH64::R_AARCH64_ABS16, "ABS16"},
{ RELOC_AARCH64::R_AARCH64_PREL64, "PREL64"},
{ RELOC_AARCH64::R_AARCH64_PREL32, "PREL32"},
{ RELOC_AARCH64::R_AARCH64_PREL16, "PREL16"},
{ RELOC_AARCH64::R_AARCH64_MOVW_UABS_G0, "MOVW_UABS_G0"},
{ RELOC_AARCH64::R_AARCH64_MOVW_UABS_G0_NC, "MOVW_UABS_G0_NC"},
{ RELOC_AARCH64::R_AARCH64_MOVW_UABS_G1, "MOVW_UABS_G1"},
{ RELOC_AARCH64::R_AARCH64_MOVW_UABS_G1_NC, "MOVW_UABS_G1_NC"},
{ RELOC_AARCH64::R_AARCH64_MOVW_UABS_G2, "MOVW_UABS_G2"},
{ RELOC_AARCH64::R_AARCH64_MOVW_UABS_G2_NC, "MOVW_UABS_G2_NC"},
{ RELOC_AARCH64::R_AARCH64_MOVW_UABS_G3, "MOVW_UABS_G3"},
{ RELOC_AARCH64::R_AARCH64_MOVW_SABS_G0, "MOVW_SABS_G0"},
{ RELOC_AARCH64::R_AARCH64_MOVW_SABS_G1, "MOVW_SABS_G1"},
{ RELOC_AARCH64::R_AARCH64_MOVW_SABS_G2, "MOVW_SABS_G2"},
{ RELOC_AARCH64::R_AARCH64_LD_PREL_LO19, "LD_PREL_LO19"},
{ RELOC_AARCH64::R_AARCH64_ADR_PREL_LO21, "ADR_PREL_LO21"},
{ RELOC_AARCH64::R_AARCH64_ADR_PREL_PG_HI21, "ADR_PREL_PG_HI21"},
{ RELOC_AARCH64::R_AARCH64_ADR_PREL_PG_HI21_NC, "ADR_PREL_PG_HI21_NC"},
{ RELOC_AARCH64::R_AARCH64_ADD_ABS_LO12_NC, "ADD_ABS_LO12_NC"},
{ RELOC_AARCH64::R_AARCH64_LDST8_ABS_LO12_NC, "LDST8_ABS_LO12_NC"},
{ RELOC_AARCH64::R_AARCH64_TSTBR14, "TSTBR14"},
{ RELOC_AARCH64::R_AARCH64_CONDBR19, "CONDBR19"},
{ RELOC_AARCH64::R_AARCH64_JUMP26, "JUMP26"},
{ RELOC_AARCH64::R_AARCH64_CALL26, "CALL26"},
{ RELOC_AARCH64::R_AARCH64_LDST16_ABS_LO12_NC, "LDST16_ABS_LO12_NC"},
{ RELOC_AARCH64::R_AARCH64_LDST32_ABS_LO12_NC, "LDST32_ABS_LO12_NC"},
{ RELOC_AARCH64::R_AARCH64_LDST64_ABS_LO12_NC, "LDST64_ABS_LO12_NC"},
{ RELOC_AARCH64::R_AARCH64_MOVW_PREL_G0, "MOVW_PREL_G0"},
{ RELOC_AARCH64::R_AARCH64_MOVW_PREL_G0_NC, "MOVW_PREL_G0_NC"},
{ RELOC_AARCH64::R_AARCH64_MOVW_PREL_G1, "MOVW_PREL_G1"},
{ RELOC_AARCH64::R_AARCH64_MOVW_PREL_G1_NC, "MOVW_PREL_G1_NC"},
{ RELOC_AARCH64::R_AARCH64_MOVW_PREL_G2, "MOVW_PREL_G2"},
{ RELOC_AARCH64::R_AARCH64_MOVW_PREL_G2_NC, "MOVW_PREL_G2_NC"},
{ RELOC_AARCH64::R_AARCH64_MOVW_PREL_G3, "MOVW_PREL_G3"},
{ RELOC_AARCH64::R_AARCH64_LDST128_ABS_LO12_NC, "LDST128_ABS_LO12_NC"},
{ RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G0, "MOVW_GOTOFF_G0"},
{ RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G0_NC, "MOVW_GOTOFF_G0_NC"},
{ RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G1, "MOVW_GOTOFF_G1"},
{ RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G1_NC, "MOVW_GOTOFF_G1_NC"},
{ RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G2, "MOVW_GOTOFF_G2"},
{ RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G2_NC, "MOVW_GOTOFF_G2_NC"},
{ RELOC_AARCH64::R_AARCH64_MOVW_GOTOFF_G3, "MOVW_GOTOFF_G3"},
{ RELOC_AARCH64::R_AARCH64_GOTREL64, "GOTREL64"},
{ RELOC_AARCH64::R_AARCH64_GOTREL32, "GOTREL32"},
{ RELOC_AARCH64::R_AARCH64_GOT_LD_PREL19, "GOT_LD_PREL19"},
{ RELOC_AARCH64::R_AARCH64_LD64_GOTOFF_LO15, "LD64_GOTOFF_LO15"},
{ RELOC_AARCH64::R_AARCH64_ADR_GOT_PAGE, "ADR_GOT_PAGE"},
{ RELOC_AARCH64::R_AARCH64_LD64_GOT_LO12_NC, "LD64_GOT_LO12_NC"},
{ RELOC_AARCH64::R_AARCH64_LD64_GOTPAGE_LO15, "LD64_GOTPAGE_LO15"},
{ RELOC_AARCH64::R_AARCH64_TLSGD_ADR_PREL21, "TLSGD_ADR_PREL21"},
{ RELOC_AARCH64::R_AARCH64_TLSGD_ADR_PAGE21, "TLSGD_ADR_PAGE21"},
{ RELOC_AARCH64::R_AARCH64_TLSGD_ADD_LO12_NC, "TLSGD_ADD_LO12_NC"},
{ RELOC_AARCH64::R_AARCH64_TLSGD_MOVW_G1, "TLSGD_MOVW_G1"},
{ RELOC_AARCH64::R_AARCH64_TLSGD_MOVW_G0_NC, "TLSGD_MOVW_G0_NC"},
{ RELOC_AARCH64::R_AARCH64_TLSLD_ADR_PREL21, "TLSLD_ADR_PREL21"},
{ RELOC_AARCH64::R_AARCH64_TLSLD_ADR_PAGE21, "TLSLD_ADR_PAGE21"},
{ RELOC_AARCH64::R_AARCH64_TLSLD_ADD_LO12_NC, "TLSLD_ADD_LO12_NC"},
{ RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_G1, "TLSLD_MOVW_G1"},
{ RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_G0_NC, "TLSLD_MOVW_G0_NC"},
{ RELOC_AARCH64::R_AARCH64_TLSLD_LD_PREL19, "TLSLD_LD_PREL19"},
{ RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_DTPREL_G2, "TLSLD_MOVW_DTPREL_G2"},
{ RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_DTPREL_G1, "TLSLD_MOVW_DTPREL_G1"},
{ RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC, "TLSLD_MOVW_DTPREL_G1_NC"},
{ RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_DTPREL_G0, "TLSLD_MOVW_DTPREL_G0"},
{ RELOC_AARCH64::R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC, "TLSLD_MOVW_DTPREL_G0_NC"},
{ RELOC_AARCH64::R_AARCH64_TLSLD_ADD_DTPREL_HI12, "TLSLD_ADD_DTPREL_HI12"},
{ RELOC_AARCH64::R_AARCH64_TLSLD_ADD_DTPREL_LO12, "TLSLD_ADD_DTPREL_LO12"},
{ RELOC_AARCH64::R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC, "TLSLD_ADD_DTPREL_LO12_NC"},
{ RELOC_AARCH64::R_AARCH64_TLSLD_LDST8_DTPREL_LO12, "TLSLD_LDST8_DTPREL_LO12"},
{ RELOC_AARCH64::R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC, "TLSLD_LDST8_DTPREL_LO12_NC"},
{ RELOC_AARCH64::R_AARCH64_TLSLD_LDST16_DTPREL_LO12, "TLSLD_LDST16_DTPREL_LO12"},
{ RELOC_AARCH64::R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC, "TLSLD_LDST16_DTPREL_LO12_NC"},
{ RELOC_AARCH64::R_AARCH64_TLSLD_LDST32_DTPREL_LO12, "TLSLD_LDST32_DTPREL_LO12"},
{ RELOC_AARCH64::R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC, "TLSLD_LDST32_DTPREL_LO12_NC"},
{ RELOC_AARCH64::R_AARCH64_TLSLD_LDST64_DTPREL_LO12, "TLSLD_LDST64_DTPREL_LO12"},
{ RELOC_AARCH64::R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC, "TLSLD_LDST64_DTPREL_LO12_NC"},
{ RELOC_AARCH64::R_AARCH64_TLSIE_MOVW_GOTTPREL_G1, "TLSIE_MOVW_GOTTPREL_G1"},
{ RELOC_AARCH64::R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC, "TLSIE_MOVW_GOTTPREL_G0_NC"},
{ RELOC_AARCH64::R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21, "TLSIE_ADR_GOTTPREL_PAGE21"},
{ RELOC_AARCH64::R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC, "TLSIE_LD64_GOTTPREL_LO12_NC"},
{ RELOC_AARCH64::R_AARCH64_TLSIE_LD_GOTTPREL_PREL19, "TLSIE_LD_GOTTPREL_PREL19"},
{ RELOC_AARCH64::R_AARCH64_TLSLE_MOVW_TPREL_G2, "TLSLE_MOVW_TPREL_G2"},
{ RELOC_AARCH64::R_AARCH64_TLSLE_MOVW_TPREL_G1, "TLSLE_MOVW_TPREL_G1"},
{ RELOC_AARCH64::R_AARCH64_TLSLE_MOVW_TPREL_G1_NC, "TLSLE_MOVW_TPREL_G1_NC"},
{ RELOC_AARCH64::R_AARCH64_TLSLE_MOVW_TPREL_G0, "TLSLE_MOVW_TPREL_G0"},
{ RELOC_AARCH64::R_AARCH64_TLSLE_MOVW_TPREL_G0_NC, "TLSLE_MOVW_TPREL_G0_NC"},
{ RELOC_AARCH64::R_AARCH64_TLSLE_ADD_TPREL_HI12, "TLSLE_ADD_TPREL_HI12"},
{ RELOC_AARCH64::R_AARCH64_TLSLE_ADD_TPREL_LO12, "TLSLE_ADD_TPREL_LO12"},
{ RELOC_AARCH64::R_AARCH64_TLSLE_ADD_TPREL_LO12_NC, "TLSLE_ADD_TPREL_LO12_NC"},
{ RELOC_AARCH64::R_AARCH64_TLSLE_LDST8_TPREL_LO12, "TLSLE_LDST8_TPREL_LO12"},
{ RELOC_AARCH64::R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC, "TLSLE_LDST8_TPREL_LO12_NC"},
{ RELOC_AARCH64::R_AARCH64_TLSLE_LDST16_TPREL_LO12, "TLSLE_LDST16_TPREL_LO12"},
{ RELOC_AARCH64::R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC, "TLSLE_LDST16_TPREL_LO12_NC"},
{ RELOC_AARCH64::R_AARCH64_TLSLE_LDST32_TPREL_LO12, "TLSLE_LDST32_TPREL_LO12"},
{ RELOC_AARCH64::R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC, "TLSLE_LDST32_TPREL_LO12_NC"},
{ RELOC_AARCH64::R_AARCH64_TLSLE_LDST64_TPREL_LO12, "TLSLE_LDST64_TPREL_LO12"},
{ RELOC_AARCH64::R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC, "TLSLE_LDST64_TPREL_LO12_NC"},
{ RELOC_AARCH64::R_AARCH64_TLSDESC_LD_PREL19, "TLSDESC_LD_PREL19"},
{ RELOC_AARCH64::R_AARCH64_TLSDESC_ADR_PREL21, "TLSDESC_ADR_PREL21"},
{ RELOC_AARCH64::R_AARCH64_TLSDESC_ADR_PAGE21, "TLSDESC_ADR_PAGE21"},
{ RELOC_AARCH64::R_AARCH64_TLSDESC_LD64_LO12_NC, "TLSDESC_LD64_LO12_NC"},
{ RELOC_AARCH64::R_AARCH64_TLSDESC_ADD_LO12_NC, "TLSDESC_ADD_LO12_NC"},
{ RELOC_AARCH64::R_AARCH64_TLSDESC_OFF_G1, "TLSDESC_OFF_G1"},
{ RELOC_AARCH64::R_AARCH64_TLSDESC_OFF_G0_NC, "TLSDESC_OFF_G0_NC"},
{ RELOC_AARCH64::R_AARCH64_TLSDESC_LDR, "TLSDESC_LDR"},
{ RELOC_AARCH64::R_AARCH64_TLSDESC_ADD, "TLSDESC_ADD"},
{ RELOC_AARCH64::R_AARCH64_TLSDESC_CALL, "TLSDESC_CALL"},
{ RELOC_AARCH64::R_AARCH64_TLSLE_LDST128_TPREL_LO12, "TLSLE_LDST128_TPREL_LO12"},
{ RELOC_AARCH64::R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC, "TLSLE_LDST128_TPREL_LO12_NC"},
{ RELOC_AARCH64::R_AARCH64_TLSLD_LDST128_DTPREL_LO12, "TLSLD_LDST128_DTPREL_LO12"},
{ RELOC_AARCH64::R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC, "TLSLD_LDST128_DTPREL_LO12_NC"},
{ RELOC_AARCH64::R_AARCH64_COPY, "COPY"},
{ RELOC_AARCH64::R_AARCH64_GLOB_DAT, "GLOB_DAT"},
{ RELOC_AARCH64::R_AARCH64_JUMP_SLOT, "JUMP_SLOT"},
{ RELOC_AARCH64::R_AARCH64_RELATIVE, "RELATIVE"},
{ RELOC_AARCH64::R_AARCH64_TLS_DTPREL64, "TLS_DTPREL64"},
{ RELOC_AARCH64::R_AARCH64_TLS_DTPMOD64, "TLS_DTPMOD64"},
{ RELOC_AARCH64::R_AARCH64_TLS_TPREL64, "TLS_TPREL64"},
{ RELOC_AARCH64::R_AARCH64_TLSDESC, "TLSDESC"},
{ RELOC_AARCH64::R_AARCH64_IRELATIVE, "IRELATIVE"},
};
auto it = enumStrings.find(e);
return it == enumStrings.end() ? "UNDEFINED" : it->second;

View File

@ -140,27 +140,30 @@ std::ostream& operator<<(std::ostream& os, const Note& note) {
// ABI TAG
if (static_cast<NOTE_TYPES>(note.type()) == NOTE_TYPES::NT_GNU_ABI_TAG) {
std::tuple<uint32_t, uint32_t, uint32_t> version = note.version();
std::string version_str = "";
// Major
version_str += std::to_string(std::get<0>(version));
version_str += ".";
try {
std::tuple<uint32_t, uint32_t, uint32_t> version = note.version();
std::string version_str = "";
// Major
version_str += std::to_string(std::get<0>(version));
version_str += ".";
// Minor
version_str += std::to_string(std::get<1>(version));
version_str += ".";
// Minor
version_str += std::to_string(std::get<1>(version));
version_str += ".";
// Patch
version_str += std::to_string(std::get<2>(version));
// Patch
version_str += std::to_string(std::get<2>(version));
os << std::setw(33) << std::setfill(' ') << "ABI:" << to_string(note.abi()) << std::endl;
os << std::setw(33) << std::setfill(' ') << "Version:" << version_str << std::endl;
os << std::setw(33) << std::setfill(' ') << "ABI:" << to_string(note.abi()) << std::endl;
os << std::setw(33) << std::setfill(' ') << "Version:" << version_str << std::endl;
} catch (const corrupted&) {
}
}
// GOLD VERSION
if (static_cast<NOTE_TYPES>(note.type()) == NOTE_TYPES::NT_GNU_GOLD_VERSION) {
std::string version_str{reinterpret_cast<const char*>(description.data())};
std::string version_str{reinterpret_cast<const char*>(description.data()), description.size()};
os << std::setw(33) << std::setfill(' ') << "Version:" << version_str << std::endl;
}

View File

@ -1554,7 +1554,7 @@ void Parser::parse_notes(uint64_t offset, uint64_t size) {
}
std::string name = {this->stream_->read_string(current_offset, namesz), namesz - 1};
LOG(DEBUG) << "Name: " << name;
LOG(DEBUG) << "Name: " << name << std::endl;
current_offset += namesz;
current_offset = align(current_offset, sizeof(uint32_t));

View File

@ -19,6 +19,7 @@
#include "LIEF/visitors/Hash.hpp"
#include "LIEF/ELF/Relocation.hpp"
#include "LIEF/ELF/RelocationSizes.hpp"
#include "LIEF/ELF/EnumToString.hpp"
namespace LIEF {
@ -159,6 +160,57 @@ bool Relocation::has_symbol(void) const {
return this->symbol_ != nullptr;
}
uint32_t Relocation::size(void) const {
switch (this->architecture()) {
case ARCH::EM_X86_64:
{
try {
return relocation_x86_64_sizes.at(static_cast<RELOC_x86_64>(this->type()));
} catch (const std::out_of_range&) {
throw not_implemented(to_string(this->architecture()) + std::string(" - ") + to_string(static_cast<RELOC_x86_64>(this->type())));
}
break;
}
case ARCH::EM_386:
{
try {
return relocation_i386_sizes.at(static_cast<RELOC_i386>(this->type()));
} catch (const std::out_of_range&) {
throw not_implemented(to_string(this->architecture()) + std::string(" - ") + to_string(static_cast<RELOC_i386>(this->type())));
}
break;
}
case ARCH::EM_ARM:
{
try {
return relocation_ARM_sizes.at(static_cast<RELOC_ARM>(this->type()));
} catch (const std::out_of_range&) {
throw not_implemented(to_string(this->architecture()) + std::string(" - ") + to_string(static_cast<RELOC_ARM>(this->type())));
}
break;
}
case ARCH::EM_AARCH64:
{
try {
return relocation_AARCH64_sizes.at(static_cast<RELOC_AARCH64>(this->type()));
} catch (const std::out_of_range&) {
throw not_implemented(to_string(this->architecture()) + std::string(" - ") + to_string(static_cast<RELOC_AARCH64>(this->type())));
}
break;
}
default:
{
throw not_implemented(to_string(this->architecture()));
}
}
}
void Relocation::address(uint64_t address) {
this->address_ = address;
@ -213,10 +265,39 @@ std::ostream& operator<<(std::ostream& os, const Relocation& entry) {
}
std::string relocation_type = "";
if (entry.architecture() == ARCH::EM_X86_64) {
relocation_type = to_string(static_cast<RELOC_x86_64>(entry.type()));
switch (entry.architecture()) {
case ARCH::EM_X86_64:
{
relocation_type = to_string(static_cast<RELOC_x86_64>(entry.type()));
break;
}
case ARCH::EM_386:
{
relocation_type = to_string(static_cast<RELOC_i386>(entry.type()));
break;
}
case ARCH::EM_ARM:
{
relocation_type = to_string(static_cast<RELOC_ARM>(entry.type()));
break;
}
case ARCH::EM_AARCH64:
{
relocation_type = to_string(static_cast<RELOC_AARCH64>(entry.type()));
break;
}
default:
{
relocation_type = std::to_string(entry.type());
}
}
os << std::setw(10) << entry.address()
<< std::setw(10) << relocation_type
<< std::setw(10) << symbol_name;

View File

@ -79,6 +79,7 @@ if (LIEF_EXAMPLES)
file(GLOB_RECURSE SAMPLES_ELF
"${LIEF_SAMPLES_DIRECTORY}/ELF/*.bin"
"${LIEF_SAMPLES_DIRECTORY}/ELF/*.so"
"${LIEF_SAMPLES_DIRECTORY}/ELF/*.pie"
)
list(REMOVE_ITEM SAMPLES_ELF

View File

@ -8,7 +8,7 @@ import stat
import os
import logging
import random
import itertools
from subprocess import Popen
@ -137,6 +137,56 @@ class TestELF(TestCase):
self.assertEqual("".join(map(chr, n3.description)), "gold 1.12")
def test_relocation_size(self):
aarch64_toybox = lief.parse(get_sample('ELF/ELF64_AARCH64_piebinary_toybox.pie'))
arm_ls = lief.parse(get_sample('ELF/ELF32_ARM_binary_ls.bin'))
x86_ls = lief.parse(get_sample('ELF/ELF32_x86_binary_ls.bin'))
x86_64_ls = lief.parse(get_sample('ELF/ELF64_x86-64_binary_ld.bin'))
for r in itertools.chain(aarch64_toybox.dynamic_relocations, aarch64_toybox.pltgot_relocations):
if lief.ELF.RELOCATION_AARCH64(r.type) == lief.ELF.RELOCATION_AARCH64.RELATIVE:
self.assertEqual(r.size, 64)
if lief.ELF.RELOCATION_AARCH64(r.type) == lief.ELF.RELOCATION_AARCH64.GLOB_DAT:
self.assertEqual(r.size, 64)
if lief.ELF.RELOCATION_AARCH64(r.type) == lief.ELF.RELOCATION_AARCH64.JUMP_SLOT:
self.assertEqual(r.size, 64)
for r in itertools.chain(arm_ls.dynamic_relocations, arm_ls.pltgot_relocations):
if lief.ELF.RELOCATION_ARM(r.type) == lief.ELF.RELOCATION_ARM.RELATIVE:
self.assertEqual(r.size, 32)
if lief.ELF.RELOCATION_ARM(r.type) == lief.ELF.RELOCATION_ARM.GLOB_DAT:
self.assertEqual(r.size, 32)
if lief.ELF.RELOCATION_ARM(r.type) == lief.ELF.RELOCATION_ARM.ABS32:
self.assertEqual(r.size, 32)
if lief.ELF.RELOCATION_ARM(r.type) == lief.ELF.RELOCATION_ARM.JUMP_SLOT:
self.assertEqual(r.size, 32)
for r in itertools.chain(x86_ls.dynamic_relocations, x86_ls.pltgot_relocations):
if lief.ELF.RELOCATION_i386(r.type) == lief.ELF.RELOCATION_i386.GLOB_DAT:
self.assertEqual(r.size, 32)
if lief.ELF.RELOCATION_i386(r.type) == lief.ELF.RELOCATION_i386.COPY:
self.assertEqual(r.size, 32)
if lief.ELF.RELOCATION_i386(r.type) == lief.ELF.RELOCATION_i386.JUMP_SLOT:
self.assertEqual(r.size, 32)
for r in itertools.chain(x86_64_ls.dynamic_relocations, x86_64_ls.pltgot_relocations):
if lief.ELF.RELOCATION_X86_64(r.type) == lief.ELF.RELOCATION_X86_64.GLOB_DAT:
self.assertEqual(r.size, 64)
if lief.ELF.RELOCATION_X86_64(r.type) == lief.ELF.RELOCATION_X86_64.COPY:
self.assertEqual(r.size, 32)
if lief.ELF.RELOCATION_X86_64(r.type) == lief.ELF.RELOCATION_X86_64.JUMP_SLOT:
self.assertEqual(r.size, 64)
def test_sectionless(self):
sample = "ELF/ELF64_x86-64_binary_rvs.bin"