Add assembler support for @gotplt

Obsolete R_X86_64_GOTPLT64 and treat it the same as R_X86_64_GOT64.

bfd/

	PR gas/17598
	* elf64-x86-64.c (elf_x86_64_check_relocs): Treat
	R_X86_64_GOTPLT64 the same as R_X86_64_GOT64.
	(elf_x86_64_relocate_section): Likewise.

gas/

	PR gas/17598
	* config/tc-i386.c (reloc): Support BFD_RELOC_X86_64_GOTPLT64.

gas/testsuite/

	PR gas/17598
	* gas/i386/reloc64.s: Add @gotplt check.

	* gas/i386/reloc64.d: Updated.
	* gas/i386/reloc64.l: Likewise.

ld/testsuite/

	PR gas/17598
	* ld-x86-64/x86-64.exp: Run gotplt1.

	* ld-x86-64/gotplt1.d: New file.
	* ld-x86-64/gotplt1.s: Likewise.
This commit is contained in:
H.J. Lu 2014-11-13 11:07:31 -08:00
parent 5784b3caf8
commit 553d1284b7
12 changed files with 72 additions and 16 deletions

View File

@ -1,3 +1,10 @@
2014-11-13 H.J. Lu <hongjiu.lu@intel.com>
PR gas/17598
* elf64-x86-64.c (elf_x86_64_check_relocs): Treat
R_X86_64_GOTPLT64 the same as R_X86_64_GOT64.
(elf_x86_64_relocate_section): Likewise.
2014-11-13 Nick Clifton <nickc@redhat.com>
PR binutils/17512

View File

@ -1752,14 +1752,6 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
if (h != NULL)
{
if (r_type == R_X86_64_GOTPLT64)
{
/* This relocation indicates that we also need
a PLT entry, as this is a function. We don't need
a PLT entry for local symbols. */
h->needs_plt = 1;
h->plt.refcount += 1;
}
h->got.refcount += 1;
old_tls_type = elf_x86_64_hash_entry (h)->tls_type;
}
@ -2181,8 +2173,6 @@ elf_x86_64_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
case R_X86_64_GOTPLT64:
if (h != NULL)
{
if (r_type == R_X86_64_GOTPLT64 && h->plt.refcount > 0)
h->plt.refcount -= 1;
if (h->got.refcount > 0)
h->got.refcount -= 1;
if (h->type == STT_GNU_IFUNC)
@ -3720,12 +3710,7 @@ elf_x86_64_relocate_section (bfd *output_bfd,
case R_X86_64_GOTPCREL64:
/* Use global offset table entry as symbol value. */
case R_X86_64_GOTPLT64:
/* This is the same as GOT64 for relocation purposes, but
indicates the existence of a PLT entry. The difficulty is,
that we must calculate the GOT slot offset from the PLT
offset, if this symbol got a PLT entry (it was global).
Additionally if it's computed from the PLT entry, then that
GOT offset is relative to .got.plt, not to .got. */
/* This is obsolete and treated the the same as GOT64. */
base_got = htab->elf.sgot;
if (htab->elf.sgot == NULL)

View File

@ -1,3 +1,8 @@
2014-11-13 H.J. Lu <hongjiu.lu@intel.com>
PR gas/17598
* config/tc-i386.c (reloc): Support BFD_RELOC_X86_64_GOTPLT64.
2014-11-13 Nick Clifton <nickc@redhat.com>
PR binutils/17512

View File

@ -2835,6 +2835,9 @@ reloc (unsigned int size,
case BFD_RELOC_X86_64_GOT32:
return BFD_RELOC_X86_64_GOT64;
break;
case BFD_RELOC_X86_64_GOTPLT64:
return BFD_RELOC_X86_64_GOTPLT64;
break;
case BFD_RELOC_X86_64_PLTOFF64:
return BFD_RELOC_X86_64_PLTOFF64;
break;

View File

@ -1,3 +1,11 @@
2014-11-13 H.J. Lu <hongjiu.lu@intel.com>
PR gas/17598
* gas/i386/reloc64.s: Add @gotplt check.
* gas/i386/reloc64.d: Updated.
* gas/i386/reloc64.l: Likewise.
2014-11-07 H.J. Lu <hongjiu.lu@intel.com>
PR ld/17482

View File

@ -50,6 +50,7 @@ Disassembly of section \.text:
.*[ ]+R_X86_64_TPOFF32[ ]+xtrn
.*[ ]+R_X86_64_TPOFF32[ ]+xtrn
.*[ ]+R_X86_64_TPOFF32[ ]+xtrn
.*[ ]+R_X86_64_GOTPLT64[ ]+xtrn
Disassembly of section \.data:
#...
.*[ ]+R_X86_64_64[ ]+xtrn
@ -89,3 +90,4 @@ Disassembly of section \.data:
.*[ ]+R_X86_64_PC8[ ]+xtrn
.*[ ]+R_X86_64_GOT32[ ]+xtrn-0x4
.*[ ]+R_X86_64_GOT32[ ]+xtrn\+0x4
.*[ ]+R_X86_64_GOTPLT64[ ]+xtrn

View File

@ -71,3 +71,13 @@
.*:195: Error: .*
.*:196: Error: .*
.*:197: Error: .*
.*:208: Error: .*
.*:209: Error: .*
.*:210: Error: .*
.*:211: Error: .*
.*:212: Error: .*
.*:213: Error: .*
.*:214: Error: .*
.*:218: Error: .*
.*:219: Error: .*
.*:220: Error: .*

View File

@ -202,3 +202,19 @@ bad .byte xtrn@tpoff
.data
.long xtrn@got - 4
.long xtrn@got + 4
.text
movabs $xtrn@gotplt, %rax
bad add $xtrn@gotplt, %rax
bad mov $xtrn@gotplt, %eax
bad mov $xtrn@gotplt, %ax
bad mov $xtrn@gotplt, %al
bad mov xtrn@gotplt(%rbx), %eax
bad mov xtrn@gotplt(%ebx), %eax
bad call xtrn@gotplt
.data
.quad xtrn@gotplt
bad .long xtrn@gotplt
bad .word xtrn@gotplt
bad .byte xtrn@gotplt

View File

@ -1,3 +1,11 @@
2014-11-13 H.J. Lu <hongjiu.lu@intel.com>
PR gas/17598
* ld-x86-64/x86-64.exp: Run gotplt1.
* ld-x86-64/gotplt1.d: New file.
* ld-x86-64/gotplt1.s: Likewise.
2014-11-11 Jiong Wang <jiong.wang@arm.com>
* lib/ld-lib.exp (run_ld_link_exec_tests): Append board_cflags if gcc

View File

@ -0,0 +1,6 @@
#as: --64
#ld: -shared -melf_x86_64
#readelf: -r --wide
#...
[0-9a-f]+ +[0-9a-f]+ +R_X86_64_GLOB_DAT +[0-9a-f]+ +foo \+ 0

View File

@ -0,0 +1,5 @@
.globl _start
.type _start, @function
_start:
movabsq $foo@GOTPLT, %rax
.size _start, .-_start

View File

@ -227,6 +227,7 @@ run_dump_test "pr12570a"
run_dump_test "pr12570b"
run_dump_test "pr14215"
run_dump_test "pr14207"
run_dump_test "gotplt1"
if { ![istarget "x86_64-*-linux*"] && ![istarget "x86_64-*-nacl*"]} {
return