Don't resolve size relocation against non-zero TLS symbol
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 7 Feb 2013 02:15:30 +0000 (02:15 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 7 Feb 2013 02:15:30 +0000 (02:15 +0000)
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.

12 files changed:
bfd/ChangeLog
bfd/elf32-i386.c
bfd/elf64-x86-64.c
ld/testsuite/ChangeLog
ld/testsuite/ld-size/size-10.rd
ld/testsuite/ld-size/size-8.rd
ld/testsuite/ld-size/size.exp
ld/testsuite/ld-size/size32-2-i386.d
ld/testsuite/ld-size/size32-2-x32.d
ld/testsuite/ld-size/size32-2-x86-64.d
ld/testsuite/ld-size/size64-2-x32.d
ld/testsuite/ld-size/size64-2-x86-64.d

index 7565d924a9af8e8ef5f1114390b5265625746950..50ed06f6fc6e00b71a9c1bc5cefae5a6ac45dd74 100644 (file)
@@ -1,5 +1,16 @@
+2013-02-06  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * 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  <sandra@codesourcery.com>
-            Andrew Jenner <andrew@codesourcery.com>
+           Andrew Jenner <andrew@codesourcery.com>
 
        Based on patches from Altera Corporation.
 
index 01e50a41c6d95cc2ac19179893532622c399b222..f8ad1d1c1fccf7e32a2f7b2f88cabc8038629061 100644 (file)
@@ -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:
index 71f33e2b80d52c498dd282ccca6dbe727a4e4d44..79b6dc606071aa2281ab6ff90acd0228f6591d66 100644 (file)
@@ -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:
index 11535a68fe967e3ab2eb451d8e65b159b2d1af05..2c12a52678a4b29470c2e1a72cfff1107ef8b88b 100644 (file)
@@ -1,5 +1,18 @@
+2013-02-06  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * 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  <sandra@codesourcery.com>
-            Andrew Jenner <andrew@codesourcery.com>
+           Andrew Jenner <andrew@codesourcery.com>
 
        Based on patches from Altera Corporation.
 
index 1cad47ef72e022679b907200727fe95ee5106024..a5f8ee8ded4460171ad1e4e9795a4de6bf48ad01 100644 (file)
@@ -1,4 +1,3 @@
-#failif
-#...
-.* +R_.*_NONE +.*
 #...
+[0-9a-f]+ +[0-9a-f]+ +R_.*_SIZE(32|64) +.*
+#pass
index 1cad47ef72e022679b907200727fe95ee5106024..a5f8ee8ded4460171ad1e4e9795a4de6bf48ad01 100644 (file)
@@ -1,4 +1,3 @@
-#failif
-#...
-.* +R_.*_NONE +.*
 #...
+[0-9a-f]+ +[0-9a-f]+ +R_.*_SIZE(32|64) +.*
+#pass
index a1cbc17b18a236451a68a7e1378c29ba9632bf23..9fe152c3d75bd2e25bc3646fa032b22184c69940 100644 (file)
@@ -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" ""
index 328006eae8a08d443375790079ca71d29076724b..2db0e1d33ea6cb185d8f87449083c26c330816b4 100644 (file)
@@ -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                             ....            
index 5049c4ad91b43cbdba47f8637ebebdebe830180b..9c1eae2695ce6eca72322de26eb4015ff0c029b1 100644 (file)
@@ -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                             ....            
index 482b1422fa2a15b826f7de7de767227199f511b4..1851e0f021e41e243c4ced496affd7fdeb8e7343 100644 (file)
@@ -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                             ....            
index 987f24412a12529f237c4cd6bcea5b53f9567123..1a30c984fe594201cb721cf83709d466976bb574 100644 (file)
@@ -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                    ........        
index 72c6592e4e43051e0ef4b729e02996b17086315a..4cc11cfde3405add34f8d0fbb834adf5dffca169 100644 (file)
@@ -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                    ........