From 20e52bd2b8041df10920960f5882636d420ebb13 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Thu, 7 Feb 2013 02:15:30 +0000 Subject: Don't resolve size relocation against non-zero TLS symbol bfd/ * elf32-i386.c (elf_i386_allocate_dynrelocs): Don't clear pc_count for non-zero TLS symbol. (elf_i386_relocate_section): Don't resolve size relocation against non-zero TLS symbol. * elf64-x86-64.c (elf_x86_64_allocate_dynrelocs): Don't clear pc_count for non-zero TLS symbol. (elf_x86_64_relocate_section): Don't resolve size relocation against non-zero TLS symbol. ld/testsuite/ * ld-size/size-10.rd: Updated. * ld-size/size-8.rd: Likewise. * ld-size/size32-2-i386.d: Likewise. * ld-size/size32-2-x32.d: Likewise. * ld-size/size32-2-x86-64.d: Likewise. * ld-size/size64-2-x32.d: Likewise. * ld-size/size64-2-x86-64.d: Likewise. * ld-size/size.exp (run_time_tests): Pass --hash-styl=gnu to linker for size-8 test. --- bfd/ChangeLog | 13 ++++++++++++- bfd/elf32-i386.c | 24 ------------------------ bfd/elf64-x86-64.c | 24 ------------------------ 3 files changed, 12 insertions(+), 49 deletions(-) (limited to 'bfd') diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 7565d92..50ed06f 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,16 @@ +2013-02-06 H.J. Lu + + * elf32-i386.c (elf_i386_allocate_dynrelocs): Don't clear pc_count + for non-zero TLS symbol. + (elf_i386_relocate_section): Don't resolve size relocation against + non-zero TLS symbol. + * elf64-x86-64.c (elf_x86_64_allocate_dynrelocs): Don't clear + pc_count for non-zero TLS symbol. + (elf_x86_64_relocate_section): Don't resolve size relocation + against non-zero TLS symbol. + 2013-02-06 Sandra Loosemore - Andrew Jenner + Andrew Jenner Based on patches from Altera Corporation. diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 01e50a4..f8ad1d1 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -2358,24 +2358,6 @@ elf_i386_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) if (eh->dyn_relocs == NULL) return TRUE; - /* Since pc_count for TLS symbol can only have size relocations and - we always resolve size relocation against non-zero TLS symbol, we - clear pc_count for non-zero TLS symbol. */ - if (h->type == STT_TLS && h->size != 0) - { - struct elf_dyn_relocs **pp; - - for (pp = &eh->dyn_relocs; (p = *pp) != NULL; ) - { - p->count -= p->pc_count; - p->pc_count = 0; - if (p->count == 0) - *pp = p->next; - else - pp = &p->next; - } - } - /* In the shared -Bsymbolic case, discard space allocated for dynamic pc-relative relocs against symbols which turn out to be defined in regular objects. For the normal shared case, discard @@ -3709,12 +3691,6 @@ elf_i386_relocate_section (bfd *output_bfd, case R_386_SIZE32: /* Set to symbol size. */ relocation = st_size; - if (h && h->type == STT_TLS && st_size != 0) - { - /* Resolve size relocation against non-zero TLS symbol. */ - unresolved_reloc = FALSE; - break; - } /* Fall through. */ case R_386_32: diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 71f33e2..79b6dc6 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -2400,24 +2400,6 @@ elf_x86_64_allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf) if (eh->dyn_relocs == NULL) return TRUE; - /* Since pc_count for TLS symbol can only have size relocations and - we always resolve size relocation against non-zero TLS symbol, we - clear pc_count for non-zero TLS symbol. */ - if (h->type == STT_TLS && h->size != 0) - { - struct elf_dyn_relocs **pp; - - for (pp = &eh->dyn_relocs; (p = *pp) != NULL; ) - { - p->count -= p->pc_count; - p->pc_count = 0; - if (p->count == 0) - *pp = p->next; - else - pp = &p->next; - } - } - /* In the shared -Bsymbolic case, discard space allocated for dynamic pc-relative relocs against symbols which turn out to be defined in regular objects. For the normal shared case, discard @@ -3705,12 +3687,6 @@ elf_x86_64_relocate_section (bfd *output_bfd, case R_X86_64_SIZE64: /* Set to symbol size. */ relocation = st_size; - if (h && h->type == STT_TLS && st_size != 0) - { - /* Resolve size relocation against non-zero TLS symbol. */ - unresolved_reloc = FALSE; - break; - } goto direct; case R_X86_64_PC8: -- cgit v1.1