From: H.J. Lu Date: Thu, 7 Feb 2013 02:15:30 +0000 (+0000) Subject: Don't resolve size relocation against non-zero TLS symbol X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=20e52bd2b8041df10920960f5882636d420ebb13;p=binutils-gdb.git 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. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 7565d924a9a..50ed06f6fc6 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 01e50a41c6d..f8ad1d1c1fc 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 71f33e2b80d..79b6dc60607 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: diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 11535a68fe9..2c12a52678a 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,5 +1,18 @@ +2013-02-06 H.J. Lu + + * 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. + 2013-02-06 Sandra Loosemore - Andrew Jenner + Andrew Jenner Based on patches from Altera Corporation. diff --git a/ld/testsuite/ld-size/size-10.rd b/ld/testsuite/ld-size/size-10.rd index 1cad47ef72e..a5f8ee8ded4 100644 --- a/ld/testsuite/ld-size/size-10.rd +++ b/ld/testsuite/ld-size/size-10.rd @@ -1,4 +1,3 @@ -#failif -#... -.* +R_.*_NONE +.* #... +[0-9a-f]+ +[0-9a-f]+ +R_.*_SIZE(32|64) +.* +#pass diff --git a/ld/testsuite/ld-size/size-8.rd b/ld/testsuite/ld-size/size-8.rd index 1cad47ef72e..a5f8ee8ded4 100644 --- a/ld/testsuite/ld-size/size-8.rd +++ b/ld/testsuite/ld-size/size-8.rd @@ -1,4 +1,3 @@ -#failif -#... -.* +R_.*_NONE +.* #... +[0-9a-f]+ +[0-9a-f]+ +R_.*_SIZE(32|64) +.* +#pass diff --git a/ld/testsuite/ld-size/size.exp b/ld/testsuite/ld-size/size.exp index a1cbc17b18a..9fe152c3d75 100644 --- a/ld/testsuite/ld-size/size.exp +++ b/ld/testsuite/ld-size/size.exp @@ -156,7 +156,7 @@ if { [regexp_diff "tmpdir/dump.out" "$srcdir/$subdir/size-7.out" ] } then { # Run-time size relocation tests. set run_time_tests { {"Run size-8" - "tmpdir/libsize-8.so" "" + "tmpdir/libsize-8.so --hash-styl=gnu" "" {size-8a.c} "size-8" "size-8.out"} {"Run size-9" "tmpdir/libsize-9.so" "" diff --git a/ld/testsuite/ld-size/size32-2-i386.d b/ld/testsuite/ld-size/size32-2-i386.d index 328006eae8a..2db0e1d33ea 100644 --- a/ld/testsuite/ld-size/size32-2-i386.d +++ b/ld/testsuite/ld-size/size32-2-i386.d @@ -8,11 +8,13 @@ DYNAMIC RELOCATION RECORDS OFFSET TYPE VALUE -0+1234 R_386_SIZE32 zzz -0+1238 R_386_SIZE32 zzz -0+123c R_386_SIZE32 zzz +0+123c R_386_SIZE32 xxx +0+1240 R_386_SIZE32 yyy +0+1244 R_386_SIZE32 zzz +0+1248 R_386_SIZE32 zzz +0+124c R_386_SIZE32 zzz Contents of section .data: - 122c 28000000 28000000 00000000 e2ffffff ................ - 123c 1e000000 .... + 123c 00000000 00000000 00000000 e2ffffff ................ + 124c 1e000000 .... diff --git a/ld/testsuite/ld-size/size32-2-x32.d b/ld/testsuite/ld-size/size32-2-x32.d index 5049c4ad91b..9c1eae2695c 100644 --- a/ld/testsuite/ld-size/size32-2-x32.d +++ b/ld/testsuite/ld-size/size32-2-x32.d @@ -8,11 +8,13 @@ DYNAMIC RELOCATION RECORDS OFFSET TYPE VALUE -0+200268 R_X86_64_SIZE32 zzz -0+20026c R_X86_64_SIZE32 zzz-0x0000001e -0+200270 R_X86_64_SIZE32 zzz\+0x0000001e +0+200278 R_X86_64_SIZE32 xxx +0+20027c R_X86_64_SIZE32 yyy +0+200280 R_X86_64_SIZE32 zzz +0+200284 R_X86_64_SIZE32 zzz-0x0000001e +0+200288 R_X86_64_SIZE32 zzz\+0x0000001e Contents of section .data: - 200260 28000000 28000000 00000000 00000000 ................ - 200270 00000000 .... + 200278 00000000 00000000 00000000 00000000 ................ + 200288 00000000 .... diff --git a/ld/testsuite/ld-size/size32-2-x86-64.d b/ld/testsuite/ld-size/size32-2-x86-64.d index 482b1422fa2..1851e0f021e 100644 --- a/ld/testsuite/ld-size/size32-2-x86-64.d +++ b/ld/testsuite/ld-size/size32-2-x86-64.d @@ -8,11 +8,13 @@ DYNAMIC RELOCATION RECORDS OFFSET TYPE VALUE -0+2003b0 R_X86_64_SIZE32 zzz -0+2003b4 R_X86_64_SIZE32 zzz-0x000000000000001e -0+2003b8 R_X86_64_SIZE32 zzz\+0x000000000000001e +0+2003d8 R_X86_64_SIZE32 xxx +0+2003dc R_X86_64_SIZE32 yyy +0+2003e0 R_X86_64_SIZE32 zzz +0+2003e4 R_X86_64_SIZE32 zzz-0x000000000000001e +0+2003e8 R_X86_64_SIZE32 zzz\+0x000000000000001e Contents of section .data: - 2003a8 28000000 28000000 00000000 00000000 ................ - 2003b8 00000000 .... + 2003d8 00000000 00000000 00000000 00000000 ................ + 2003e8 00000000 .... diff --git a/ld/testsuite/ld-size/size64-2-x32.d b/ld/testsuite/ld-size/size64-2-x32.d index 987f24412a1..1a30c984fe5 100644 --- a/ld/testsuite/ld-size/size64-2-x32.d +++ b/ld/testsuite/ld-size/size64-2-x32.d @@ -8,12 +8,14 @@ DYNAMIC RELOCATION RECORDS OFFSET TYPE VALUE -0+200270 R_X86_64_SIZE32 zzz -0+200278 R_X86_64_SIZE64 zzz-0x0000001e -0+200280 R_X86_64_SIZE64 zzz\+0x0000001e +0+200278 R_X86_64_SIZE32 xxx +0+200280 R_X86_64_SIZE32 yyy +0+200288 R_X86_64_SIZE32 zzz +0+200290 R_X86_64_SIZE64 zzz-0x0000001e +0+200298 R_X86_64_SIZE64 zzz\+0x0000001e Contents of section .data: - 200260 28000000 00000000 28000000 00000000 ................ - 200270 00000000 00000000 00000000 00000000 ................ - 200280 00000000 00000000 ........ + 200278 00000000 00000000 00000000 00000000 ................ + 200288 00000000 00000000 00000000 00000000 ................ + 200298 00000000 00000000 ........ diff --git a/ld/testsuite/ld-size/size64-2-x86-64.d b/ld/testsuite/ld-size/size64-2-x86-64.d index 72c6592e4e4..4cc11cfde34 100644 --- a/ld/testsuite/ld-size/size64-2-x86-64.d +++ b/ld/testsuite/ld-size/size64-2-x86-64.d @@ -8,12 +8,14 @@ DYNAMIC RELOCATION RECORDS OFFSET TYPE VALUE -0+2003b8 R_X86_64_SIZE64 zzz -0+2003c0 R_X86_64_SIZE64 zzz-0x000000000000001e -0+2003c8 R_X86_64_SIZE64 zzz\+0x000000000000001e +0+2003d8 R_X86_64_SIZE64 xxx +0+2003e0 R_X86_64_SIZE64 yyy +0+2003e8 R_X86_64_SIZE64 zzz +0+2003f0 R_X86_64_SIZE64 zzz-0x000000000000001e +0+2003f8 R_X86_64_SIZE64 zzz\+0x000000000000001e Contents of section .data: - 2003a8 28000000 00000000 28000000 00000000 ................ - 2003b8 00000000 00000000 00000000 00000000 ................ - 2003c8 00000000 00000000 ........ + 2003d8 00000000 00000000 00000000 00000000 ................ + 2003e8 00000000 00000000 00000000 00000000 ................ + 2003f8 00000000 00000000 ........