diff --git a/utils/process-pt-dynamic.c b/utils/process-pt-dynamic.c index 528b4e8d26639eb365ec8c331a91353cece3de10..48a4991dd295880cc326f6b75d4ee819ca46eb87 100644 --- a/utils/process-pt-dynamic.c +++ b/utils/process-pt-dynamic.c @@ -222,6 +222,94 @@ try_relocation (ElfW(Addr) *reloc_addr, const char *name, void *data) #define DUMP_SLOTINFO(n,x) \ DEBUG(DEBUG_ELF, "%s has slot type %s (%d)", n, #x, x) +static const char * +reloc_type_name (int type) +{ + switch (type) + { + case R_X86_64_JUMP_SLOT: + return "R_X86_64_JUMP_SLOT"; + case R_X86_64_NONE: + return "R_X86_64_NONE"; + case R_X86_64_64: + return "R_X86_64_64"; + case R_X86_64_PC32: + return "R_X86_64_PC32"; + case R_X86_64_GOT32: + return "R_X86_64_GOT32"; + case R_X86_64_PLT32: + return "R_X86_64_PLT32"; + case R_X86_64_COPY: + return "R_X86_64_COPY"; + case R_X86_64_GLOB_DAT: + return "R_X86_64_GLOB_DAT"; + case R_X86_64_RELATIVE: + return "R_X86_64_RELATIVE"; + case R_X86_64_GOTPCREL: + return "R_X86_64_GOTPCREL"; + case R_X86_64_32: + return "R_X86_64_32"; + case R_X86_64_32S: + return "R_X86_64_32S"; + case R_X86_64_16: + return "R_X86_64_16"; + case R_X86_64_PC16: + return "R_X86_64_PC16"; + case R_X86_64_8: + return "R_X86_64_8"; + case R_X86_64_PC8: + return "R_X86_64_PC8"; + case R_X86_64_DTPMOD64: + return "R_X86_64_DTPMOD64"; + case R_X86_64_DTPOFF64: + return "R_X86_64_DTPOFF64"; + case R_X86_64_TPOFF64: + return "R_X86_64_TPOFF64"; + case R_X86_64_TLSGD: + return "R_X86_64_TLSGD"; + case R_X86_64_TLSLD: + return "R_X86_64_TLSLD"; + case R_X86_64_DTPOFF32: + return "R_X86_64_DTPOFF32"; + case R_X86_64_GOTTPOFF: + return "R_X86_64_GOTTPOFF"; + case R_X86_64_TPOFF32: + return "R_X86_64_TPOFF32"; + case R_X86_64_PC64: + return "R_X86_64_PC64"; + case R_X86_64_GOTOFF64: + return "R_X86_64_GOTOFF64"; + case R_X86_64_GOTPC32: + return "R_X86_64_GOTPC32"; + case R_X86_64_GOT64: + return "R_X86_64_GOT64"; + case R_X86_64_GOTPCREL64: + return "R_X86_64_GOTPCREL64"; + case R_X86_64_GOTPC64: + return "R_X86_64_GOTPC64"; + case R_X86_64_GOTPLT64: + return "R_X86_64_GOTPLT64"; + case R_X86_64_PLTOFF64: + return "R_X86_64_PLTOFF64"; + case R_X86_64_SIZE32: + return "R_X86_64_SIZE32"; + case R_X86_64_SIZE64: + return "R_X86_64_SIZE64"; + case R_X86_64_GOTPC32_TLSDESC: + return "R_X86_64_GOTPC32_TLSDESC"; + case R_X86_64_TLSDESC_CALL: + return "R_X86_64_TLSDESC_CALL"; + case R_X86_64_TLSDESC: + return "R_X86_64_TLSDESC"; + case R_X86_64_IRELATIVE: + return "R_X86_64_IRELATIVE"; + case R_X86_64_RELATIVE64: + return "R_X86_64_RELATIVE64"; + default: + return "UNKNOWN"; + } +} + int process_dt_rela (const void *start, int relasz, @@ -267,19 +355,19 @@ process_dt_rela (const void *start, void *slot; // case R_386_JMP_SLOT: // these are secretly the same: + case R_X86_64_GLOB_DAT: case R_X86_64_JUMP_SLOT: + case R_X86_64_64: slot = addr( base, entry->r_offset, entry->r_addend ); DEBUG( DEBUG_ELF, - "R_X86_64_JUMP_SLOT: %p ← { offset: %"FMT_ADDR"; addend: %"FMT_SIZE" }", + "%s: %p ← { offset: %"FMT_ADDR"; addend: %"FMT_SIZE" }", + reloc_type_name( chr ), slot, entry->r_offset, entry->r_addend ); try_relocation( slot, name, data ); break; case R_X86_64_NONE: DUMP_SLOTINFO(name, R_X86_64_NONE); break; - case R_X86_64_64: - DUMP_SLOTINFO(name, R_X86_64_64); - break; case R_X86_64_PC32: DUMP_SLOTINFO(name, R_X86_64_PC32); break; @@ -292,9 +380,6 @@ process_dt_rela (const void *start, case R_X86_64_COPY: DUMP_SLOTINFO(name, R_X86_64_COPY); break; - case R_X86_64_GLOB_DAT: - DUMP_SLOTINFO(name, R_X86_64_GLOB_DAT); - break; case R_X86_64_RELATIVE: DUMP_SLOTINFO(name, R_X86_64_RELATIVE); break;