From 8ded2ddc8bac501c1ee0706cb3d3ef3fb1c10b85 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Wed, 27 May 2015 14:32:24 -0700 Subject: Convert PLT reloc only if pointer equality isn't needed When pointer equality needed, we can't replace PLT relocations with GOT relocations for -z now. This patch checks if pointer equality is needed before converting PLT relocations to GOT relocations. bfd/ PR binutils/18458 * elf32-i386.c (elf_i386_check_relocs): Create .plt.got section for now binding only if pointer equality isn't needed. (elf_i386_allocate_dynrelocs): Use .plt.got section for now binding only if pointer equality isn't needed. * elf64-x86-64.c (elf_x86_64_check_relocs): Create .plt.got section for now binding only if pointer equality isn't needed. (elf_x86_64_allocate_dynrelocs): Use .plt.got section for now binding only if pointer equality isn't needed. ld/testsuite/ PR binutils/18458 * ld-elf/shared.exp (build_tests): Build libpr18458a.so and libpr18458b.so. (run_tests): Run pr18458 test. * ld-elf/pr18458a.c: New file. * ld-elf/pr18458b.c: Likewise. * ld-elf/pr18458c.c: Likewise. --- bfd/ChangeLog | 12 ++++++++++++ bfd/elf32-i386.c | 5 +++-- bfd/elf64-x86-64.c | 5 +++-- 3 files changed, 18 insertions(+), 4 deletions(-) (limited to 'bfd') diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 87a0bff..a8a0ad9 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,15 @@ +2015-05-27 H.J. Lu + + PR binutils/18458 + * elf32-i386.c (elf_i386_check_relocs): Create .plt.got section + for now binding only if pointer equality isn't needed. + (elf_i386_allocate_dynrelocs): Use .plt.got section for now + binding only if pointer equality isn't needed. + * elf64-x86-64.c (elf_x86_64_check_relocs): Create .plt.got + section for now binding only if pointer equality isn't needed. + (elf_x86_64_allocate_dynrelocs): Use .plt.got section for now + binding only if pointer equality isn't needed. + 2015-05-26 H.J. Lu PR binutils/18437 diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 23d50e1..f3aee96 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -1885,7 +1885,8 @@ do_size: if (use_plt_got && h != NULL && h->plt.refcount > 0 - && ((info->flags & DF_BIND_NOW) || h->got.refcount > 0) + && (((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed) + || h->got.refcount > 0) && htab->plt_got == NULL) { /* Create the GOT procedure linkage table. */ @@ -2323,7 +2324,7 @@ elf_i386_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) { bfd_boolean use_plt_got; - if ((info->flags & DF_BIND_NOW)) + if ((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed) { /* Don't use the regular PLT for DF_BIND_NOW. */ h->plt.offset = (bfd_vma) -1; diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 4428f97..072c00b 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -2080,7 +2080,8 @@ do_size: if (use_plt_got && h != NULL && h->plt.refcount > 0 - && ((info->flags & DF_BIND_NOW) || h->got.refcount > 0) + && (((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed) + || h->got.refcount > 0) && htab->plt_got == NULL) { /* Create the GOT procedure linkage table. */ @@ -2542,7 +2543,7 @@ elf_x86_64_allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf) { bfd_boolean use_plt_got; - if ((info->flags & DF_BIND_NOW)) + if ((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed) { /* Don't use the regular PLT for DF_BIND_NOW. */ h->plt.offset = (bfd_vma) -1; -- cgit v1.1