From d1ec1e40b5b457c92aaa23f7af40e026e4596a99 Mon Sep 17 00:00:00 2001 From: H.J. Lu Date: Tue, 14 Jan 2014 10:48:39 -0800 Subject: [PATCH 1/1] 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(-) Upstream-Status: Backport #diff --git a/bfd/ChangeLog b/bfd/ChangeLog #index a8f1f94..7a49fd1 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 4d391e1..d7f59e5 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 edee8ec..999011b 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 -- 1.7.1