mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-30 12:44:10 +08:00
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:
parent
5784b3caf8
commit
553d1284b7
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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: .*
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
6
ld/testsuite/ld-x86-64/gotplt1.d
Normal file
6
ld/testsuite/ld-x86-64/gotplt1.d
Normal 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
|
5
ld/testsuite/ld-x86-64/gotplt1.s
Normal file
5
ld/testsuite/ld-x86-64/gotplt1.s
Normal file
@ -0,0 +1,5 @@
|
||||
.globl _start
|
||||
.type _start, @function
|
||||
_start:
|
||||
movabsq $foo@GOTPLT, %rax
|
||||
.size _start, .-_start
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user