Preserve addend for R_386_GOT32 and R_X86_64_GOT32
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 20 May 2016 13:01:28 +0000 (06:01 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 20 May 2016 13:01:28 +0000 (06:01 -0700)
We should preserve addend for R_386_GOT32 and R_X86_64_GOT32 as in
"movl $foo@GOT + 4, %eax" and "movq $foo@GOT + 4, %rax".

PR gas/19600
* config/tc-i386.c (md_apply_fix): Preserve addend for
BFD_RELOC_386_GOT32 and BFD_RELOC_X86_64_GOT32.
* testsuite/gas/i386/addend.d: New file.
* testsuite/gas/i386/addend.s: Likewise.
* testsuite/gas/i386/x86-64-addend.d: Likewise.
* testsuite/gas/i386/x86-64-addend.s: Likewise.
* testsuite/gas/i386/i386.exp: Run addend and x86-64-addend.
* testsuite/gas/i386/reloc32.d: Updated.

gas/ChangeLog
gas/config/tc-i386.c
gas/testsuite/gas/i386/addend.d [new file with mode: 0644]
gas/testsuite/gas/i386/addend.s [new file with mode: 0644]
gas/testsuite/gas/i386/i386.exp
gas/testsuite/gas/i386/reloc32.d
gas/testsuite/gas/i386/x86-64-addend.d [new file with mode: 0644]
gas/testsuite/gas/i386/x86-64-addend.s [new file with mode: 0644]

index 5d5672e9d558aad964c03d7ca54302861b17d563..272f8fe49f586a69698086fe3e95b839ed763029 100644 (file)
@@ -1,3 +1,15 @@
+2016-05-20  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR gas/19600
+       * config/tc-i386.c (md_apply_fix): Preserve addend for
+       BFD_RELOC_386_GOT32 and BFD_RELOC_X86_64_GOT32.
+       * testsuite/gas/i386/addend.d: New file.
+       * testsuite/gas/i386/addend.s: Likewise.
+       * testsuite/gas/i386/x86-64-addend.d: Likewise.
+       * testsuite/gas/i386/x86-64-addend.s: Likewise.
+       * testsuite/gas/i386/i386.exp: Run addend and x86-64-addend.
+       * testsuite/gas/i386/reloc32.d: Updated.
+
 2016-05-20  Maciej W. Rozycki  <macro@imgtec.com>
 
        * config/tc-mips.c (append_insn): Correct the encoding of a
index 25a0fa20ad896a30efc81a9a7e7b631009d446d3..8a4d987507176ec64a1296c3960ec30587755c24 100644 (file)
@@ -9341,11 +9341,6 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
        fixP->fx_done = 0;
        return;
 
-      case BFD_RELOC_386_GOT32:
-      case BFD_RELOC_X86_64_GOT32:
-       value = 0; /* Fully resolved at runtime.  No addend.  */
-       break;
-
       case BFD_RELOC_VTABLE_INHERIT:
       case BFD_RELOC_VTABLE_ENTRY:
        fixP->fx_done = 0;
diff --git a/gas/testsuite/gas/i386/addend.d b/gas/testsuite/gas/i386/addend.d
new file mode 100644 (file)
index 0000000..db60c91
--- /dev/null
@@ -0,0 +1,14 @@
+#as: -mrelax-relocations=yes
+#objdump: -dwr
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+0+ <_start>:
+[      ]*[a-f0-9]+:    b8 00 00 00 00          mov    \$0x0,%eax       1: R_386_GOT32  foo
+[      ]*[a-f0-9]+:    b8 04 00 00 00          mov    \$0x4,%eax       6: R_386_GOT32  foo
+[      ]*[a-f0-9]+:    b8 00 00 00 00          mov    \$0x0,%eax       b: R_386_GOT32  foo
+[      ]*[a-f0-9]+:    b8 04 00 00 00          mov    \$0x4,%eax       10: R_386_GOT32 foo
+#pass
diff --git a/gas/testsuite/gas/i386/addend.s b/gas/testsuite/gas/i386/addend.s
new file mode 100644 (file)
index 0000000..d7e68dd
--- /dev/null
@@ -0,0 +1,9 @@
+       .text
+_start:
+       movl    $foo@GOT, %eax
+       movl    $foo@GOT + 4, %eax
+
+       .intel_syntax noprefix
+
+       mov     eax, offset foo@got
+       mov     eax, offset foo@got + 4
index df1518b6b81272d52c661ac72e4710b4a89dfad0..a18200ed7341d9b36172640c3927c05ab8052af9 100644 (file)
@@ -412,6 +412,8 @@ if [expr ([istarget "i*86-*-*"] ||  [istarget "x86_64-*-*"]) && [gas_32_check]]
        run_dump_test "got"
        run_dump_test "got-no-relax"
 
+       run_dump_test "addend"
+
        if {![istarget "*-*-nacl*"]} then {
            run_dump_test "iamcu-1"
            run_dump_test "iamcu-2"
@@ -797,6 +799,8 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_64_check]] t
 
        run_dump_test "x86-64-gotpcrel"
        run_dump_test "x86-64-gotpcrel-no-relax"
+
+       run_dump_test "x86-64-addend"
     }
 
     set ASFLAGS "$old_ASFLAGS"
index b6e1bbd8104b95a0fe4768846cd9061cb0fe1ecb..263a742022e1478028e5b8949b4fb79bea7e53a0 100644 (file)
@@ -68,4 +68,6 @@ Disassembly of section \.data:
 .*[    ]+R_386_PC8[    ]+xtrn
 #...
 .*[    ]+R_386_GOT32[  ]+xtrn
+#...
 .*[    ]+R_386_GOT32[  ]+xtrn
+#pass
diff --git a/gas/testsuite/gas/i386/x86-64-addend.d b/gas/testsuite/gas/i386/x86-64-addend.d
new file mode 100644 (file)
index 0000000..d3d3d8b
--- /dev/null
@@ -0,0 +1,14 @@
+#as: -mrelax-relocations=yes
+#objdump: -dwr
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+0+ <_start>:
+[      ]*[a-f0-9]+:    48 c7 c0 00 00 00 00    mov    \$0x0,%rax       3: R_X86_64_GOT32       foo
+[      ]*[a-f0-9]+:    48 c7 c0 00 00 00 00    mov    \$0x0,%rax       a: R_X86_64_GOT32       foo\+0x4
+[      ]*[a-f0-9]+:    48 c7 c0 00 00 00 00    mov    \$0x0,%rax       11: R_X86_64_GOT32      foo
+[      ]*[a-f0-9]+:    48 c7 c0 00 00 00 00    mov    \$0x0,%rax       18: R_X86_64_GOT32      foo\+0x4
+#pass
diff --git a/gas/testsuite/gas/i386/x86-64-addend.s b/gas/testsuite/gas/i386/x86-64-addend.s
new file mode 100644 (file)
index 0000000..7b04e72
--- /dev/null
@@ -0,0 +1,9 @@
+       .text
+_start:
+       movq    $foo@GOT, %rax
+       movq    $foo@GOT + 4, %rax
+
+       .intel_syntax noprefix
+
+       mov     rax, offset foo@got
+       mov     rax, offset foo@got + 4