From d1ec1e40b5b457c92aaa23f7af40e026e4596a99 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Tue, 14 Jan 2014 10:48:39 -0800 Subject: [PATCH] Don't update reloc count if there are any non pc-relative relocs PR ld/16428 * elf32-i386.c (elf_i386_allocate_dynrelocs): Don't update reloc count if there are any non pc-relative relocs. * elf64-x86-64.c (elf_x86_64_allocate_dynrelocs): Likewise. --- bfd/ChangeLog | 7 +++++++ bfd/elf32-i386.c | 9 +++++++-- bfd/elf64-x86-64.c | 9 +++++++-- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index a8f1f9477f..7a49fd1685 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2014-01-14 H.J. Lu + + PR ld/16428 + * elf32-i386.c (elf_i386_allocate_dynrelocs): Don't update reloc + count if there are any non pc-relative relocs. + * elf64-x86-64.c (elf_x86_64_allocate_dynrelocs): Likewise. + 2014-01-14 Michael Hudson-Doyle Kugan Vivekanandarajah diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 4d391e13c7..d7f59e5e25 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -2368,8 +2368,13 @@ elf_i386_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) for (pp = &eh->dyn_relocs; (p = *pp) != NULL; ) { - p->count -= p->pc_count; - p->pc_count = 0; + /* Don't update reloc count if there are any non + pc-relative relocs. */ + if (!h->pointer_equality_needed) + { + p->count -= p->pc_count; + p->pc_count = 0; + } if (p->count == 0) *pp = p->next; else diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index edee8ecefd..999011bf59 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -2463,8 +2463,13 @@ elf_x86_64_allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf) for (pp = &eh->dyn_relocs; (p = *pp) != NULL; ) { - p->count -= p->pc_count; - p->pc_count = 0; + /* Don't update reloc count if there are any non + pc-relative relocs. */ + if (!h->pointer_equality_needed) + { + p->count -= p->pc_count; + p->pc_count = 0; + } if (p->count == 0) *pp = p->next; else -- 2.34.1