From 265a60a0d285a733d9d98f53672bce668803b434 Mon Sep 17 00:00:00 2001 From: Dmitriy Ivanov Date: Tue, 13 Jan 2015 12:17:31 -0800 Subject: [PATCH] Refactoring: use generic reloc constants Change-Id: I67918a1a926164a38a5a47f2264390632eb42905 --- linker/linker.cpp | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/linker/linker.cpp b/linker/linker.cpp index e0fec0f08..36e5b2e86 100644 --- a/linker/linker.cpp +++ b/linker/linker.cpp @@ -1320,33 +1320,25 @@ int soinfo::relocate(ElfW(Rela)* rela, unsigned count, const soinfo_list_t& glob */ switch (type) { + case R_GENERIC_JUMP_SLOT: + case R_GENERIC_GLOB_DAT: + case R_GENERIC_RELATIVE: + case R_GENERIC_IRELATIVE: #if defined(__aarch64__) - case R_AARCH64_JUMP_SLOT: - case R_AARCH64_GLOB_DAT: case R_AARCH64_ABS64: case R_AARCH64_ABS32: case R_AARCH64_ABS16: - case R_AARCH64_RELATIVE: - case R_AARCH64_IRELATIVE: +#elif defined(__x86_64__) + case R_X86_64_32: + case R_X86_64_64: + case R_X86_64_PC32: +#endif /* * The sym_addr was initialized to be zero above, or the relocation * code below does not care about value of sym_addr. * No need to do anything. */ break; -#elif defined(__x86_64__) - case R_X86_64_JUMP_SLOT: - case R_X86_64_GLOB_DAT: - case R_X86_64_32: - case R_X86_64_64: - case R_X86_64_RELATIVE: - case R_X86_64_IRELATIVE: - // No need to do anything. - break; - case R_X86_64_PC32: - sym_addr = reloc; - break; -#endif default: DL_ERR("unknown weak reloc type %d @ %p (%zu)", type, rela, idx); return -1; @@ -1513,7 +1505,7 @@ int soinfo::relocate(ElfW(Rela)* rela, unsigned count, const soinfo_list_t& glob TRACE_TYPE(RELO, "RELO R_X86_64_PC32 %08zx <- +%08zx (%08zx - %08zx) %s", static_cast(reloc), static_cast(sym_addr - reloc), static_cast(sym_addr), static_cast(reloc), sym_name); - *reinterpret_cast(reloc) = sym_addr + rela->r_addend - reloc; + *reinterpret_cast(reloc) = (sym_addr == 0 ? 0 : sym_addr - reloc) + rela->r_addend; break; #endif