This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[committed 2/2] MIPS/BFD: Fix TLS relocation resolution for regular executables


Correct an issue with commit 0f20cc3522e7 ("TLS support for MIPS"), 
<https://sourceware.org/ml/binutils/2005-02/msg00607.html>, where a 
condition used to determine whether to use a dynamic symbol for GD, LD 
and IE TLS dynamic relocations against a symbol that has been defined 
locally has been incorrectly reversed.

It's executables rather than dynamic shared objects where no symbol is 
required, because such symbols cannot be preempted and therefore their 
values (thread pointer offsets) are fixed at the static link time as is 
the associated module ID of the main executable, so the original 
condition should have been `shared' instead of `!shared'.  This wrong 
condition was then later converted from `!shared' to `!bfd_link_pic', 
with commit 0e1862bb401f ("Add output_type to bfd_link_info").

Use the correct `bfd_link_dll' condition then, and adjust code for the 
dynamic symbol index possibly being -1 as with symbols that have been 
forced local, removing unnecessary dynamic relocations from dynamic 
regular executables.  PIE executables are unaffected as the existing 
condition excluded them by chance due to the conversion mentioned above.

Adjust test cases accordingly.

	bfd/
	* elfxx-mips.c (mips_tls_got_relocs): Use `bfd_link_dll' rather 
	than `!bfd_link_pic' in determining the dynamic symbol index.  
	Avoid the index of -1.
	(mips_elf_initialize_tls_slots): Likewise.  Flatten code by 
	moving `dyn' to the beginning of the function block.

	ld/
	* testsuite/ld-mips-elf/tlsdyn-o32.d: Update test for dynamic
	relocation removal.
	* testsuite/ld-mips-elf/tlsdyn-o32.got: Likewise.
	* testsuite/ld-mips-elf/tlsdyn-o32-1.d: Likewise.
	* testsuite/ld-mips-elf/tlsdyn-o32-1.got: Likewise.
	* testsuite/ld-mips-elf/tlsdyn-o32-2.d: Likewise.
	* testsuite/ld-mips-elf/tlsdyn-o32-2.got: Likewise.
	* testsuite/ld-mips-elf/tlsdyn-o32-3.d: Likewise.
	* testsuite/ld-mips-elf/tlsdyn-o32-3.got: Likewise.
---
 bfd/elfxx-mips.c                          |   22 ++++++++++------------
 ld/testsuite/ld-mips-elf/tlsdyn-o32-1.d   |    4 ++--
 ld/testsuite/ld-mips-elf/tlsdyn-o32-1.got |    7 ++-----
 ld/testsuite/ld-mips-elf/tlsdyn-o32-2.d   |    4 ++--
 ld/testsuite/ld-mips-elf/tlsdyn-o32-2.got |    7 ++-----
 ld/testsuite/ld-mips-elf/tlsdyn-o32-3.d   |    4 ++--
 ld/testsuite/ld-mips-elf/tlsdyn-o32-3.got |    7 ++-----
 ld/testsuite/ld-mips-elf/tlsdyn-o32.d     |    2 +-
 ld/testsuite/ld-mips-elf/tlsdyn-o32.got   |    7 ++-----
 9 files changed, 25 insertions(+), 39 deletions(-)

Index: binutils/bfd/elfxx-mips.c
===================================================================
--- binutils.orig/bfd/elfxx-mips.c	2018-07-10 23:25:42.467696179 +0100
+++ binutils/bfd/elfxx-mips.c	2018-07-10 23:25:42.709598480 +0100
@@ -3251,8 +3251,10 @@ mips_tls_got_relocs (struct bfd_link_inf
   bfd_boolean need_relocs = FALSE;
   bfd_boolean dyn = elf_hash_table (info)->dynamic_sections_created;
 
-  if (h && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
-      && (!bfd_link_pic (info) || !SYMBOL_REFERENCES_LOCAL (info, h)))
+  if (h != NULL
+      && h->dynindx != -1
+      && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
+      && (bfd_link_dll (info) || !SYMBOL_REFERENCES_LOCAL (info, h)))
     indx = h->dynindx;
 
   if ((bfd_link_dll (info) || indx != 0)
@@ -3340,6 +3342,7 @@ mips_elf_initialize_tls_slots (bfd *abfd
 			       struct mips_elf_link_hash_entry *h,
 			       bfd_vma value)
 {
+  bfd_boolean dyn = elf_hash_table (info)->dynamic_sections_created;
   struct mips_elf_link_hash_table *htab;
   int indx;
   asection *sreloc, *sgot;
@@ -3353,16 +3356,11 @@ mips_elf_initialize_tls_slots (bfd *abfd
   sgot = htab->root.sgot;
 
   indx = 0;
-  if (h != NULL)
-    {
-      bfd_boolean dyn = elf_hash_table (info)->dynamic_sections_created;
-
-      if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info),
-					   &h->root)
-	  && (!bfd_link_pic (info)
-	      || !SYMBOL_REFERENCES_LOCAL (info, &h->root)))
-	indx = h->root.dynindx;
-    }
+  if (h != NULL
+      && h->root.dynindx != -1
+      && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), &h->root)
+      && (bfd_link_dll (info) || !SYMBOL_REFERENCES_LOCAL (info, &h->root)))
+    indx = h->root.dynindx;
 
   if (entry->tls_initialized)
     return;
Index: binutils/ld/testsuite/ld-mips-elf/tlsdyn-o32-1.d
===================================================================
--- binutils.orig/ld/testsuite/ld-mips-elf/tlsdyn-o32-1.d	2018-07-11 15:42:02.151095343 +0100
+++ binutils/ld/testsuite/ld-mips-elf/tlsdyn-o32-1.d	2018-07-11 15:42:52.312588293 +0100
@@ -5,7 +5,7 @@
 
 .* <__start>:
   .*:	3c1c0fc0 	lui	gp,0xfc0
-  .*:	279c7b80 	addiu	gp,gp,31616
+  .*:	279c7ba0 	addiu	gp,gp,31648
   .*:	0399e021 	addu	gp,gp,t9
   .*:	27bdfff0 	addiu	sp,sp,-16
   .*:	afbe0008 	sw	s8,8\(sp\)
@@ -55,7 +55,7 @@
 
 .* <other>:
   .*:	3c1c0fc0 	lui	gp,0xfc0
-  .*:	279c7ac0 	addiu	gp,gp,31424
+  .*:	279c7ae0 	addiu	gp,gp,31456
   .*:	0399e021 	addu	gp,gp,t9
   .*:	27bdfff0 	addiu	sp,sp,-16
   .*:	afbe0008 	sw	s8,8\(sp\)
Index: binutils/ld/testsuite/ld-mips-elf/tlsdyn-o32-1.got
===================================================================
--- binutils.orig/ld/testsuite/ld-mips-elf/tlsdyn-o32-1.got	2018-07-11 15:42:02.171334976 +0100
+++ binutils/ld/testsuite/ld-mips-elf/tlsdyn-o32-1.got	2018-07-11 15:42:52.326711410 +0100
@@ -4,15 +4,12 @@
 DYNAMIC RELOCATION RECORDS
 OFFSET   TYPE              VALUE 
 00000000 R_MIPS_NONE       \*ABS\*
-10000038 R_MIPS_TLS_DTPMOD32  tlsbin_gd@@Base
-1000003c R_MIPS_TLS_DTPREL32  tlsbin_gd@@Base
 1000002c R_MIPS_TLS_DTPMOD32  tlsvar_gd@VER_1
 10000030 R_MIPS_TLS_DTPREL32  tlsvar_gd@VER_1
 10000040 R_MIPS_TLS_TPREL32  tlsvar_ie@VER_1
-10000034 R_MIPS_TLS_TPREL32  tlsbin_ie@@Base
 
 
 Contents of section .got:
- 10000020 00000000 80000000 0040053c 00000000  .........@......
- 10000030 00000000 00000000 00000000 00000000  ................
+ 10000020 00000000 80000000 0040051c 00000000  .........@......
+ 10000030 00000000 ffff900c 00000001 ffff8008  ................
  10000040 00000000 00000001 00000000           ............    
Index: binutils/ld/testsuite/ld-mips-elf/tlsdyn-o32-2.d
===================================================================
--- binutils.orig/ld/testsuite/ld-mips-elf/tlsdyn-o32-2.d	2018-07-11 15:42:02.187459479 +0100
+++ binutils/ld/testsuite/ld-mips-elf/tlsdyn-o32-2.d	2018-07-11 15:42:52.346905834 +0100
@@ -5,7 +5,7 @@
 
 .* <__start>:
   .*:	3c1c0fc0 	lui	gp,0xfc0
-  .*:	279c7b80 	addiu	gp,gp,31616
+  .*:	279c7ba0 	addiu	gp,gp,31648
   .*:	0399e021 	addu	gp,gp,t9
   .*:	27bdfff0 	addiu	sp,sp,-16
   .*:	afbe0008 	sw	s8,8\(sp\)
@@ -55,7 +55,7 @@
 
 .* <other>:
   .*:	3c1c0fc0 	lui	gp,0xfc0
-  .*:	279c7ac0 	addiu	gp,gp,31424
+  .*:	279c7ae0 	addiu	gp,gp,31456
   .*:	0399e021 	addu	gp,gp,t9
   .*:	27bdfff0 	addiu	sp,sp,-16
   .*:	afbe0008 	sw	s8,8\(sp\)
Index: binutils/ld/testsuite/ld-mips-elf/tlsdyn-o32-2.got
===================================================================
--- binutils.orig/ld/testsuite/ld-mips-elf/tlsdyn-o32-2.got	2018-07-11 15:42:02.191490818 +0100
+++ binutils/ld/testsuite/ld-mips-elf/tlsdyn-o32-2.got	2018-07-11 15:42:52.359079073 +0100
@@ -4,15 +4,12 @@
 DYNAMIC RELOCATION RECORDS
 OFFSET   TYPE              VALUE 
 00000000 R_MIPS_NONE       \*ABS\*
-10000038 R_MIPS_TLS_DTPMOD32  tlsbin_gd@@Base
-1000003c R_MIPS_TLS_DTPREL32  tlsbin_gd@@Base
 1000002c R_MIPS_TLS_DTPMOD32  tlsvar_gd@VER_1
 10000030 R_MIPS_TLS_DTPREL32  tlsvar_gd@VER_1
 10000040 R_MIPS_TLS_TPREL32  tlsvar_ie@VER_1
-10000034 R_MIPS_TLS_TPREL32  tlsbin_ie@@Base
 
 
 Contents of section .got:
- 10000020 00000000 80000000 0040053c 00000000  .*
- 10000030 00000000 00000000 00000000 00000000  .*
+ 10000020 00000000 80000000 0040051c 00000000  .*
+ 10000030 00000000 ffff900c 00000001 ffff8008  .*
  10000040 00000000 00000001 00000000           .*
Index: binutils/ld/testsuite/ld-mips-elf/tlsdyn-o32-3.d
===================================================================
--- binutils.orig/ld/testsuite/ld-mips-elf/tlsdyn-o32-3.d	2018-07-11 15:42:02.209643561 +0100
+++ binutils/ld/testsuite/ld-mips-elf/tlsdyn-o32-3.d	2018-07-11 15:42:52.371226883 +0100
@@ -5,7 +5,7 @@
 
 .* <other>:
   .*:	3c1c0fc0 	lui	gp,0xfc0
-  .*:	279c7b80 	addiu	gp,gp,31616
+  .*:	279c7ba0 	addiu	gp,gp,31648
   .*:	0399e021 	addu	gp,gp,t9
   .*:	27bdfff0 	addiu	sp,sp,-16
   .*:	afbe0008 	sw	s8,8\(sp\)
@@ -51,7 +51,7 @@
 
 .* <__start>:
   .*:	3c1c0fc0 	lui	gp,0xfc0
-  .*:	279c7ad0 	addiu	gp,gp,31440
+  .*:	279c7af0 	addiu	gp,gp,31472
   .*:	0399e021 	addu	gp,gp,t9
   .*:	27bdfff0 	addiu	sp,sp,-16
   .*:	afbe0008 	sw	s8,8\(sp\)
Index: binutils/ld/testsuite/ld-mips-elf/tlsdyn-o32-3.got
===================================================================
--- binutils.orig/ld/testsuite/ld-mips-elf/tlsdyn-o32-3.got	2018-07-11 15:42:02.220720521 +0100
+++ binutils/ld/testsuite/ld-mips-elf/tlsdyn-o32-3.got	2018-07-11 15:42:52.381290444 +0100
@@ -4,15 +4,12 @@
 DYNAMIC RELOCATION RECORDS
 OFFSET   TYPE              VALUE 
 00000000 R_MIPS_NONE       \*ABS\*
-10000038 R_MIPS_TLS_DTPMOD32  tlsbin_gd@@Base
-1000003c R_MIPS_TLS_DTPREL32  tlsbin_gd@@Base
 1000002c R_MIPS_TLS_DTPMOD32  tlsvar_gd@VER_1
 10000030 R_MIPS_TLS_DTPREL32  tlsvar_gd@VER_1
 10000040 R_MIPS_TLS_TPREL32  tlsvar_ie@VER_1
-10000034 R_MIPS_TLS_TPREL32  tlsbin_ie@@Base
 
 
 Contents of section .got:
- 10000020 00000000 80000000 004005ec 00000000  .*
- 10000030 00000000 00000000 00000000 00000000  .*
+ 10000020 00000000 80000000 004005cc 00000000  .*
+ 10000030 00000000 ffff900c 00000001 ffff8008  .*
  10000040 00000000 00000001 00000000           .*
Index: binutils/ld/testsuite/ld-mips-elf/tlsdyn-o32.d
===================================================================
--- binutils.orig/ld/testsuite/ld-mips-elf/tlsdyn-o32.d	2018-07-11 15:42:02.237822797 +0100
+++ binutils/ld/testsuite/ld-mips-elf/tlsdyn-o32.d	2018-07-11 15:42:52.400402370 +0100
@@ -5,7 +5,7 @@
 
 .* <__start>:
   .*:	3c1c0fc0 	lui	gp,0xfc0
-  .*:	279c7be0 	addiu	gp,gp,31712
+  .*:	279c7c00 	addiu	gp,gp,31744
   .*:	0399e021 	addu	gp,gp,t9
   .*:	27bdfff0 	addiu	sp,sp,-16
   .*:	afbe0008 	sw	s8,8\(sp\)
Index: binutils/ld/testsuite/ld-mips-elf/tlsdyn-o32.got
===================================================================
--- binutils.orig/ld/testsuite/ld-mips-elf/tlsdyn-o32.got	2018-07-11 15:42:02.258954674 +0100
+++ binutils/ld/testsuite/ld-mips-elf/tlsdyn-o32.got	2018-07-11 15:42:52.420531412 +0100
@@ -4,15 +4,12 @@ tmpdir/tls-dynamic-o32:     file format 
 DYNAMIC RELOCATION RECORDS
 OFFSET   TYPE              VALUE 
 00000000 R_MIPS_NONE       \*ABS\*
-10000044 R_MIPS_TLS_DTPMOD32  tlsbin_gd
-10000048 R_MIPS_TLS_DTPREL32  tlsbin_gd
 10000030 R_MIPS_TLS_DTPMOD32  tlsvar_gd
 10000034 R_MIPS_TLS_DTPREL32  tlsvar_gd
-1000002c R_MIPS_TLS_TPREL32  tlsbin_ie
 10000040 R_MIPS_TLS_TPREL32  tlsvar_ie
 
 
 Contents of section .got:
- 10000020 00000000 80000000 004004dc 00000000  .........@......
+ 10000020 00000000 80000000 004004bc ffff900c  .........@......
  10000030 00000000 00000000 00000001 00000000  ................
- 10000040 00000000 00000000 00000000           ............    
+ 10000040 00000000 00000001 ffff8008           ............    


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]