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