power7 thread safe plt call stubs

Alan Modra amodra@gmail.com
Tue Jan 15 06:11:00 GMT 2013


This changes powerpc64 ld and gold to default to thread-safe plt call
stubs when building shared libraries.  Jeff pointed out the obvious to
me recently:  A shared library may be used by a threaded application
but not create threads itself.  So there it no way to determine at
link time that a shared library *doesn't* needs thread safe call
stubs.

I'm leaving the default for executables unchanged.  ie. When not
specified explicitly, you get thread safe call stubs if the executable
calls well known thread creation functions.  If someone packages
thread creation into a user shared library then they're on their own.
Their app may need to be linked with -Wl,--plt-thread-safe if running
on power7 or later hardware.  (You can't determine whether an
executable is threaded by looking at shared libraries needed by the
executable.  For example, many non-threaded C++ apps link against
libstdc++.so.  The presence of a calls to pthread_create in
libstdc++.so doesn't mean the executable will ever call into those
libstdc++ functions.)

bfd/
	* elf64-ppc.c (ppc64_elf_size_stubs): Default shared libs to
	plt-thread-safe.
gold/
	* powerpc.cc (Target_powerpc::do_relax): Default shared libs to
	plt-thread-safe.
ld/testsuite/
	* ld-powerpc/tlsso.d: Adjust for plt-thread-safe stubs.
	* ld-powerpc/tlsso.g: Likewise.
	* ld-powerpc/tlsso.r: Likewise.
	* ld-powerpc/tlstocso.d: Likewise.
	* ld-powerpc/tlstocso.g: Likewise.

Index: bfd/elf64-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-ppc.c,v
retrieving revision 1.398
diff -u -p -r1.398 elf64-ppc.c
--- bfd/elf64-ppc.c	10 Jan 2013 20:03:54 -0000	1.398
+++ bfd/elf64-ppc.c	15 Jan 2013 06:07:44 -0000
@@ -11334,9 +11334,11 @@ ppc64_elf_size_stubs (struct bfd_link_in
 
   htab->plt_static_chain = plt_static_chain;
   htab->plt_stub_align = plt_stub_align;
+  if (plt_thread_safe == -1 && !info->executable)
+    plt_thread_safe = 1;
   if (plt_thread_safe == -1)
     {
-      const char *const thread_starter[] =
+      static const char *const thread_starter[] =
 	{
 	  "pthread_create",
 	  /* libstdc++ */
Index: gold/powerpc.cc
===================================================================
RCS file: /cvs/src/src/gold/powerpc.cc,v
retrieving revision 1.80
diff -u -p -r1.80 powerpc.cc
--- gold/powerpc.cc	12 Dec 2012 08:09:41 -0000	1.80
+++ gold/powerpc.cc	15 Jan 2013 05:39:37 -0000
@@ -2182,7 +2182,7 @@ Target_powerpc<size, big_endian>::do_rel
       bool thread_safe = parameters->options().plt_thread_safe();
       if (size == 64 && !parameters->options().user_set_plt_thread_safe())
 	{
-	  const char* const thread_starter[] =
+	  static const char* const thread_starter[] =
 	    {
 	      "pthread_create",
 	      /* libstdc++ */
@@ -2201,14 +2201,21 @@ Target_powerpc<size, big_endian>::do_rel
 	      "GOMP_parallel_sections_start", 
 	    };
 
-	  for (unsigned int i = 0;
-	       i < sizeof(thread_starter) / sizeof(thread_starter[0]);
-	       i++)
+	  if (parameters->options().shared())
+	    thread_safe = true;
+	  else
 	    {
-	      Symbol* sym = symtab->lookup(thread_starter[i], NULL);
-	      thread_safe = sym != NULL && sym->in_reg() && sym->in_real_elf();
-	      if (thread_safe)
-		break;
+	      for (unsigned int i = 0;
+		   i < sizeof(thread_starter) / sizeof(thread_starter[0]);
+		   i++)
+		{
+		  Symbol* sym = symtab->lookup(thread_starter[i], NULL);
+		  thread_safe = (sym != NULL
+				 && sym->in_reg()
+				 && sym->in_real_elf());
+		  if (thread_safe)
+		    break;
+		}
 	    }
 	}
       this->plt_thread_safe_ = thread_safe;
Index: ld/testsuite/ld-powerpc/tlsso.d
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-powerpc/tlsso.d,v
retrieving revision 1.12
diff -u -p -r1.12 tlsso.d
--- ld/testsuite/ld-powerpc/tlsso.d	23 Nov 2012 03:28:13 -0000	1.12
+++ ld/testsuite/ld-powerpc/tlsso.d	15 Jan 2013 02:35:52 -0000
@@ -13,20 +13,22 @@ Disassembly of section \.text:
 .*	(e9 62 80 78|78 80 62 e9) 	ld      r11,-32648\(r2\)
 .*	(7d 69 03 a6|a6 03 69 7d) 	mtctr   r11
 .*	(e8 42 80 80|80 80 42 e8) 	ld      r2,-32640\(r2\)
-.*	(4e 80 04 20|20 04 80 4e) 	bctr
+.*	(28 22 00 00|00 00 22 28) 	cmpldi  r2,0
+.*	(4c e2 04 20|20 04 e2 4c) 	bnectr\+ 
+.*	(48 00 00 ..|.. 00 00 48) 	b       .* <__glink_PLTresolve\+0x38>
 
 .* <_start>:
 .*	(38 62 80 20|20 80 62 38) 	addi    r3,r2,-32736
-.*	(4b ff ff e9|e9 ff ff 4b) 	bl      .*
+.*	(4b ff ff ..|.. ff ff 4b) 	bl      .*plt_call.__tls_get_addr.*
 .*	(e8 41 00 28|28 00 41 e8) 	ld      r2,40\(r1\)
 .*	(38 62 80 50|50 80 62 38) 	addi    r3,r2,-32688
-.*	(4b ff ff dd|dd ff ff 4b) 	bl      .*
+.*	(4b ff ff ..|.. ff ff 4b) 	bl      .*plt_call.__tls_get_addr.*
 .*	(e8 41 00 28|28 00 41 e8) 	ld      r2,40\(r1\)
 .*	(38 62 80 38|38 80 62 38) 	addi    r3,r2,-32712
-.*	(4b ff ff d1|d1 ff ff 4b) 	bl      .*
+.*	(4b ff ff ..|.. ff ff 4b) 	bl      .*plt_call.__tls_get_addr.*
 .*	(e8 41 00 28|28 00 41 e8) 	ld      r2,40\(r1\)
 .*	(38 62 80 50|50 80 62 38) 	addi    r3,r2,-32688
-.*	(4b ff ff c5|c5 ff ff 4b) 	bl      .*
+.*	(4b ff ff ..|.. ff ff 4b) 	bl      .*plt_call.__tls_get_addr.*
 .*	(e8 41 00 28|28 00 41 e8) 	ld      r2,40\(r1\)
 .*	(39 23 80 40|40 80 23 39) 	addi    r9,r3,-32704
 .*	(3d 23 00 00|00 00 23 3d) 	addis   r9,r3,0
@@ -39,10 +41,10 @@ Disassembly of section \.text:
 .*	(3d 2d 00 00|00 00 2d 3d) 	addis   r9,r13,0
 .*	(99 49 00 00|00 00 49 99) 	stb     r10,0\(r9\)
 .*	(38 62 80 08|08 80 62 38) 	addi    r3,r2,-32760
-.*	(4b ff ff 91|91 ff ff 4b) 	bl      .*
+.*	(4b ff ff ..|.. ff ff 4b) 	bl      .*plt_call.__tls_get_addr.*
 .*	(e8 41 00 28|28 00 41 e8) 	ld      r2,40\(r1\)
 .*	(38 62 80 50|50 80 62 38) 	addi    r3,r2,-32688
-.*	(4b ff ff 85|85 ff ff 4b) 	bl      .*
+.*	(4b ff ff ..|.. ff ff 4b) 	bl      .*plt_call.__tls_get_addr.*
 .*	(e8 41 00 28|28 00 41 e8) 	ld      r2,40\(r1\)
 .*	(f9 43 80 08|08 80 43 f9) 	std     r10,-32760\(r3\)
 .*	(3d 23 00 00|00 00 23 3d) 	addis   r9,r3,0
Index: ld/testsuite/ld-powerpc/tlsso.g
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-powerpc/tlsso.g,v
retrieving revision 1.10
diff -u -p -r1.10 tlsso.g
--- ld/testsuite/ld-powerpc/tlsso.g	29 Oct 2012 09:25:53 -0000	1.10
+++ ld/testsuite/ld-powerpc/tlsso.g	15 Jan 2013 02:35:52 -0000
@@ -7,7 +7,7 @@
 .*: +file format elf64-powerpc
 
 Contents of section \.got:
-.* (00000000|80870100) (00018780|00000000) 00000000 00000000  .*
+ 10788 (00000000|88870100) (00018788|00000000) 00000000 00000000  .*
 .* 00000000 00000000 00000000 00000000  .*
 .* 00000000 00000000 00000000 00000000  .*
 .* 00000000 00000000 00000000 00000000  .*
Index: ld/testsuite/ld-powerpc/tlsso.r
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-powerpc/tlsso.r,v
retrieving revision 1.34
diff -u -p -r1.34 tlsso.r
--- ld/testsuite/ld-powerpc/tlsso.r	29 Oct 2012 09:25:53 -0000	1.34
+++ ld/testsuite/ld-powerpc/tlsso.r	15 Jan 2013 02:35:52 -0000
@@ -48,9 +48,9 @@ Relocation section '\.rela\.dyn' at offs
 [0-9a-f ]+R_PPC64_TPREL16 +0+60 le0 \+ 0
 [0-9a-f ]+R_PPC64_TPREL16_HA +0+68 le1 \+ 0
 [0-9a-f ]+R_PPC64_TPREL16_LO +0+68 le1 \+ 0
-[0-9a-f ]+R_PPC64_TPREL16_DS +0+105f8 \.tdata \+ 28
-[0-9a-f ]+R_PPC64_TPREL16_HA +0+105f8 \.tdata \+ 30
-[0-9a-f ]+R_PPC64_TPREL16_LO +0+105f8 \.tdata \+ 30
+[0-9a-f ]+R_PPC64_TPREL16_DS +[0-9a-f]+ \.tdata \+ 28
+[0-9a-f ]+R_PPC64_TPREL16_HA +[0-9a-f]+ \.tdata \+ 30
+[0-9a-f ]+R_PPC64_TPREL16_LO +[0-9a-f]+ \.tdata \+ 30
 [0-9a-f ]+R_PPC64_DTPMOD64 +0
 [0-9a-f ]+R_PPC64_DTPREL64 +0
 [0-9a-f ]+R_PPC64_DTPREL64 +18
Index: ld/testsuite/ld-powerpc/tlstocso.d
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-powerpc/tlstocso.d,v
retrieving revision 1.11
diff -u -p -r1.11 tlstocso.d
--- ld/testsuite/ld-powerpc/tlstocso.d	23 Nov 2012 03:28:13 -0000	1.11
+++ ld/testsuite/ld-powerpc/tlstocso.d	15 Jan 2013 02:35:52 -0000
@@ -13,20 +13,22 @@ Disassembly of section \.text:
 .*	(e9 62 80 70|70 80 62 e9) 	ld      r11,-32656\(r2\)
 .*	(7d 69 03 a6|a6 03 69 7d) 	mtctr   r11
 .*	(e8 42 80 78|78 80 42 e8) 	ld      r2,-32648\(r2\)
-.*	(4e 80 04 20|20 04 80 4e) 	bctr
+.*	(28 22 00 00|00 00 22 28) 	cmpldi  r2,0
+.*	(4c e2 04 20|20 04 e2 4c) 	bnectr\+ 
+.*	(48 00 00 ..|.. 00 00 48) 	b       .* <__glink_PLTresolve\+0x38>
 
 .* <_start>:
 .*	(38 62 80 08|08 80 62 38) 	addi    r3,r2,-32760
-.*	(4b ff ff e9|e9 ff ff 4b) 	bl      .*
+.*	(4b ff ff ..|.. ff ff 4b) 	bl      .*plt_call.__tls_get_addr.*
 .*	(e8 41 00 28|28 00 41 e8) 	ld      r2,40\(r1\)
 .*	(38 62 80 18|18 80 62 38) 	addi    r3,r2,-32744
-.*	(4b ff ff dd|dd ff ff 4b) 	bl      .*
+.*	(4b ff ff ..|.. ff ff 4b) 	bl      .*plt_call.__tls_get_addr.*
 .*	(e8 41 00 28|28 00 41 e8) 	ld      r2,40\(r1\)
 .*	(38 62 80 28|28 80 62 38) 	addi    r3,r2,-32728
-.*	(4b ff ff d1|d1 ff ff 4b) 	bl      .*
+.*	(4b ff ff ..|.. ff ff 4b) 	bl      .*plt_call.__tls_get_addr.*
 .*	(e8 41 00 28|28 00 41 e8) 	ld      r2,40\(r1\)
 .*	(38 62 80 38|38 80 62 38) 	addi    r3,r2,-32712
-.*	(4b ff ff c5|c5 ff ff 4b) 	bl      .*
+.*	(4b ff ff ..|.. ff ff 4b) 	bl      .*plt_call.__tls_get_addr.*
 .*	(e8 41 00 28|28 00 41 e8) 	ld      r2,40\(r1\)
 .*	(39 23 80 40|40 80 23 39) 	addi    r9,r3,-32704
 .*	(3d 23 00 00|00 00 23 3d) 	addis   r9,r3,0
Index: ld/testsuite/ld-powerpc/tlstocso.g
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-powerpc/tlstocso.g,v
retrieving revision 1.10
diff -u -p -r1.10 tlstocso.g
--- ld/testsuite/ld-powerpc/tlstocso.g	29 Oct 2012 09:25:53 -0000	1.10
+++ ld/testsuite/ld-powerpc/tlstocso.g	15 Jan 2013 02:35:52 -0000
@@ -7,7 +7,7 @@
 .*
 
 Contents of section \.got:
-.* 00000000 (000186c0|c0860100) 00000000 00000000  .*
+ 106c8 00000000 (000186c8|c8860100) 00000000 00000000  .*
 .* 00000000 00000000 00000000 00000000  .*
 .* 00000000 00000000 00000000 00000000  .*
 .* 00000000 00000000 00000000 00000000  .*

-- 
Alan Modra
Australia Development Lab, IBM



More information about the Binutils mailing list