diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2016-05-20 06:01:28 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2016-05-20 06:01:28 -0700 |
commit | 4e21640f674499048157fa62f08b16f6039f78f6 (patch) | |
tree | 27085915ea4a643164975a5d4837d325a5532b56 /gas | |
parent | 17c6c9d9f3e71459edb4b6af5ec75125f0d06f87 (diff) | |
download | binutils-4e21640f674499048157fa62f08b16f6039f78f6.zip binutils-4e21640f674499048157fa62f08b16f6039f78f6.tar.gz binutils-4e21640f674499048157fa62f08b16f6039f78f6.tar.bz2 |
Preserve addend for R_386_GOT32 and R_X86_64_GOT32
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.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 12 | ||||
-rw-r--r-- | gas/config/tc-i386.c | 5 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/addend.d | 14 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/addend.s | 9 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/i386.exp | 4 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/reloc32.d | 2 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/x86-64-addend.d | 14 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/x86-64-addend.s | 9 |
8 files changed, 64 insertions, 5 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 5d5672e..272f8fe 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -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 diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 25a0fa2..8a4d987 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -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 index 0000000..db60c91 --- /dev/null +++ b/gas/testsuite/gas/i386/addend.d @@ -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 index 0000000..d7e68dd --- /dev/null +++ b/gas/testsuite/gas/i386/addend.s @@ -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 diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp index df1518b..a18200e 100644 --- a/gas/testsuite/gas/i386/i386.exp +++ b/gas/testsuite/gas/i386/i386.exp @@ -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" diff --git a/gas/testsuite/gas/i386/reloc32.d b/gas/testsuite/gas/i386/reloc32.d index b6e1bbd..263a742 100644 --- a/gas/testsuite/gas/i386/reloc32.d +++ b/gas/testsuite/gas/i386/reloc32.d @@ -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 index 0000000..d3d3d8b --- /dev/null +++ b/gas/testsuite/gas/i386/x86-64-addend.d @@ -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 index 0000000..7b04e72 --- /dev/null +++ b/gas/testsuite/gas/i386/x86-64-addend.s @@ -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 |