ELF64: PLT32, GOTPCREL, and GOTPCREL64 really need exactitude
authorH. Peter Anvin <hpa@zytor.com>
Sat, 18 Oct 2008 06:32:40 +0000 (23:32 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Sat, 18 Oct 2008 06:32:40 +0000 (23:32 -0700)
Now when the assembler is properly generating the address that we push
down to the backend, enable requesting an exact value for these
relocations (these are pointing to a specific GOT or PLT slot; the
addend is used to adjust the computed value in the instruction, not
for offset for the symbol.)

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
output/outelf64.c

index 3dfa8ba..dcb1675 100644 (file)
@@ -1100,13 +1100,13 @@ static void elf_out(int32_t segto, const void *data,
                addr = 0;
             } else if (wrt == elf_plt_sect + 1) {
                 elf_add_gsym_reloc(s, segment, addr, size,
-                                  R_X86_64_PLT32, false);
+                                  R_X86_64_PLT32, true);
                addr = 0;
             } else if (wrt == elf_gotpc_sect + 1 ||
                       wrt == elf_got_sect + 1) {
                printf("addr = %ld, pcrel = %ld\n", addr, size);
                 elf_add_gsym_reloc(s, segment, addr, size,
-                                  R_X86_64_GOTPCREL, false);
+                                  R_X86_64_GOTPCREL, true);
                addr = 0;
             } else if (wrt == elf_gotoff_sect + 1 ||
                       wrt == elf_got_sect + 1) {
@@ -1134,7 +1134,7 @@ static void elf_out(int32_t segto, const void *data,
             } else if (wrt == elf_gotpc_sect + 1 ||
                       wrt == elf_got_sect + 1) {
                 elf_add_gsym_reloc(s, segment, addr, size,
-                                  R_X86_64_GOTPCREL64, false);
+                                  R_X86_64_GOTPCREL64, true);
                addr = 0;
             } else if (wrt == elf_gotoff_sect + 1 ||
                       wrt == elf_got_sect + 1) {