aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2023-08-04 15:09:53 +0930
committerAlan Modra <amodra@gmail.com>2023-08-04 17:59:01 +0930
commitae33771224660dac25e64c3f70943a17bfab7681 (patch)
treed48602b894890c97fb00c756b3962aaf8f480ab0 /ld
parent49459ed32b71aefd0443d82c939f05933505080e (diff)
downloadgdb-ae33771224660dac25e64c3f70943a17bfab7681.zip
gdb-ae33771224660dac25e64c3f70943a17bfab7681.tar.gz
gdb-ae33771224660dac25e64c3f70943a17bfab7681.tar.bz2
PR30697, ppc32 mix of local-dynamic and global-dynamic TLS
This fixes miscounting of dynamic relocations on GOT entries when a) there are both local-dynamic and global-dynamic tls accesss for a given symbol, and b) the symbol is global with non-default visibility, and c) the __tls_get_addr calls aren't optimised away. PR 30697 bfd/ * elf32-ppc.c (allocate_dynrelocs): Correct local-dynamic reloc count. ld/ * testsuite/ld-powerpc/tls32ldgd.d, * testsuite/ld-powerpc/tls32ldgd.s: New test. * testsuite/ld-powerpc/powerpc.exp: Run it.
Diffstat (limited to 'ld')
-rw-r--r--ld/testsuite/ld-powerpc/powerpc.exp1
-rw-r--r--ld/testsuite/ld-powerpc/tls32ldgd.d13
-rw-r--r--ld/testsuite/ld-powerpc/tls32ldgd.s16
3 files changed, 30 insertions, 0 deletions
diff --git a/ld/testsuite/ld-powerpc/powerpc.exp b/ld/testsuite/ld-powerpc/powerpc.exp
index 16e25b0..6cb7bd2 100644
--- a/ld/testsuite/ld-powerpc/powerpc.exp
+++ b/ld/testsuite/ld-powerpc/powerpc.exp
@@ -522,5 +522,6 @@ run_dump_test "non-contiguous-powerpc"
run_dump_test "tprel32"
run_dump_test "tprelbad"
+run_dump_test tls32ldgd
run_dump_test "undefweak"
diff --git a/ld/testsuite/ld-powerpc/tls32ldgd.d b/ld/testsuite/ld-powerpc/tls32ldgd.d
new file mode 100644
index 0000000..88e26b9
--- /dev/null
+++ b/ld/testsuite/ld-powerpc/tls32ldgd.d
@@ -0,0 +1,13 @@
+#as: -a32
+#ld: -shared -melf32ppc
+#readelf: -rW
+
+Relocation section '\.rela\.dyn' at offset .* contains 3 entries:
+ Offset +Info +Type +Sym\. Value +Symbol's Name \+ Addend
+.* +00000044 R_PPC_DTPMOD32 +0
+.* +0000004e R_PPC_DTPREL32 +0
+.* +00000044 R_PPC_DTPMOD32 +0
+
+Relocation section '\.rela\.plt' at offset .* contains 1 entry:
+ Offset +Info +Type +Sym\. Value +Symbol's Name \+ Addend
+.* +00000215 R_PPC_JMP_SLOT +00000000 +__tls_get_addr \+ 0
diff --git a/ld/testsuite/ld-powerpc/tls32ldgd.s b/ld/testsuite/ld-powerpc/tls32ldgd.s
new file mode 100644
index 0000000..889eb44
--- /dev/null
+++ b/ld/testsuite/ld-powerpc/tls32ldgd.s
@@ -0,0 +1,16 @@
+#PR 30697
+ .section ".tbss","awT",@nobits
+ .global _start,x
+ .hidden x
+ .align 2
+x: .space 4
+
+ .text
+_start:
+ addi 3,30,x@got@tlsgd
+ bl __tls_get_addr(x@tlsgd)@plt
+
+ addi 3,30,x@got@tlsld
+ bl __tls_get_addr(x@tlsld)@plt
+ addis 3,3,x@dtprel@ha
+ addi 3,3,x@dtprel@l