OSDN Git Service

Refactoring: use generic reloc constants
authorDmitriy Ivanov <dimitry@google.com>
Tue, 13 Jan 2015 20:17:31 +0000 (12:17 -0800)
committerDmitriy Ivanov <dimitry@google.com>
Tue, 13 Jan 2015 20:17:31 +0000 (12:17 -0800)
Change-Id: I67918a1a926164a38a5a47f2264390632eb42905

linker/linker.cpp

index e0fec0f..36e5b2e 100644 (file)
@@ -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<size_t>(reloc), static_cast<size_t>(sym_addr - reloc),
                    static_cast<size_t>(sym_addr), static_cast<size_t>(reloc), sym_name);
-        *reinterpret_cast<ElfW(Addr)*>(reloc) = sym_addr + rela->r_addend - reloc;
+        *reinterpret_cast<ElfW(Addr)*>(reloc) = (sym_addr == 0 ? 0 : sym_addr - reloc) + rela->r_addend;
         break;
 #endif