diff options
-rw-r--r-- | bfd/ChangeLog | 7 | ||||
-rw-r--r-- | bfd/elf32-i386.c | 9 | ||||
-rw-r--r-- | bfd/elf64-x86-64.c | 9 |
3 files changed, 21 insertions, 4 deletions
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 <hongjiu.lu@intel.com> + + 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 <michael.hudson@linaro.org> Kugan Vivekanandarajah <kugan.vivekanandarajah@linaro.org> 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 |