aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/elfnn-riscv.c27
-rw-r--r--ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp8
-rw-r--r--ld/testsuite/ld-riscv-elf/tls.d15
-rw-r--r--ld/testsuite/ld-riscv-elf/tls.s28
-rw-r--r--ld/testsuite/ld-riscv-elf/tlsbin.d7
-rw-r--r--ld/testsuite/ld-riscv-elf/tlslib.s6
6 files changed, 85 insertions, 6 deletions
diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
index 951b19a..e5cecd7 100644
--- a/bfd/elfnn-riscv.c
+++ b/bfd/elfnn-riscv.c
@@ -1559,12 +1559,27 @@ riscv_elf_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
if (*local_got > 0)
{
*local_got = s->size;
- s->size += RISCV_ELF_WORD_BYTES;
- if (*local_tls_type & GOT_TLS_GD)
- s->size += RISCV_ELF_WORD_BYTES;
- if (bfd_link_pic (info)
- || (*local_tls_type & (GOT_TLS_GD | GOT_TLS_IE)))
- srel->size += sizeof (ElfNN_External_Rela);
+ if (*local_tls_type & (GOT_TLS_GD | GOT_TLS_IE))
+ {
+ if (*local_tls_type & GOT_TLS_GD)
+ {
+ s->size += 2 * RISCV_ELF_WORD_BYTES;
+ if (bfd_link_dll (info))
+ srel->size += sizeof (ElfNN_External_Rela);
+ }
+ if (*local_tls_type & GOT_TLS_IE)
+ {
+ s->size += RISCV_ELF_WORD_BYTES;
+ if (bfd_link_dll (info))
+ srel->size += sizeof (ElfNN_External_Rela);
+ }
+ }
+ else
+ {
+ s->size += RISCV_ELF_WORD_BYTES;
+ if (bfd_link_pic (info))
+ srel->size += sizeof (ElfNN_External_Rela);
+ }
}
else
*local_got = (bfd_vma) -1;
diff --git a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
index 7e1281d..a1dd0e5 100644
--- a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
+++ b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
@@ -319,4 +319,12 @@ if [istarget "riscv*-*-*"] {
run_dump_test "pcrel-reloc-rel-pie"
run_dump_test "pcrel-reloc-abs-nopie"
run_dump_test "pcrel-reloc-abs-pie"
+
+ run_ld_link_tests {
+ { "Build shared library for TLS runtime"
+ "-shared" "" "" {tlslib.s}
+ {} "tlslib.so" }
+ }
+ run_dump_test "tls"
+ run_dump_test "tlsbin"
}
diff --git a/ld/testsuite/ld-riscv-elf/tls.d b/ld/testsuite/ld-riscv-elf/tls.d
new file mode 100644
index 0000000..e7f2030
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/tls.d
@@ -0,0 +1,15 @@
+#source: tls.s
+#ld: --shared tmpdir/tlslib.so
+#readelf: -Wr
+
+Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 5 entries:
+ +Offset +Info +Type +Symbol's Value +Symbol's Name \+ Addend
+[0-9a-f]+ +[0-9a-f]+ R_RISCV_TLS_DTPMOD64 +0
+[0-9a-f]+ +[0-9a-f]+ R_RISCV_TLS_TPREL64 +4
+[0-9a-f]+ +[0-9a-f]+ R_RISCV_TLS_DTPMOD64 +0+ sg1 \+ 0
+[0-9a-f]+ +[0-9a-f]+ R_RISCV_TLS_DTPREL64 +0+ sg1 \+ 0
+[0-9a-f]+ +[0-9a-f]+ R_RISCV_TLS_TPREL64 +0+ sg1 \+ 0
+
+Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entry:
+ +Offset +Info +Type +Symbol's Value +Symbol's Name \+ Addend
+[0-9a-f]+ +[0-9a-f]+ R_RISCV_JUMP_SLOT +0+ __tls_get_addr \+ 0
diff --git a/ld/testsuite/ld-riscv-elf/tls.s b/ld/testsuite/ld-riscv-elf/tls.s
new file mode 100644
index 0000000..79e9bc2
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/tls.s
@@ -0,0 +1,28 @@
+ .section .tbss,"awT",@nobits
+ .global sg1
+sg1:
+ .zero 4
+sl1:
+ .zero 4
+
+ .text
+ .globl _start
+ .type _start,@function
+_start:
+ /* GD, global var */
+ la.tls.gd a0,sg1
+ call __tls_get_addr
+
+ /* IE, global var */
+ la.tls.ie a0,sg1
+ add a0,a0,tp
+
+ /* GD, local var */
+ la.tls.gd a0,sl1
+ call __tls_get_addr
+
+ /* IE, local var */
+ la.tls.ie a0,sl1
+ add a0,a0,tp
+
+ ret
diff --git a/ld/testsuite/ld-riscv-elf/tlsbin.d b/ld/testsuite/ld-riscv-elf/tlsbin.d
new file mode 100644
index 0000000..cdcd51a
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/tlsbin.d
@@ -0,0 +1,7 @@
+#source: tls.s
+#ld: -no-pie tmpdir/tlslib.so
+#readelf: -Wr
+
+Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entry:
+ +Offset +Info +Type +Symbol's Value +Symbol's Name \+ Addend
+[0-9a-f]+ +[0-9a-f]+ R_RISCV_JUMP_SLOT +[0-9a-f]+ __tls_get_addr \+ 0
diff --git a/ld/testsuite/ld-riscv-elf/tlslib.s b/ld/testsuite/ld-riscv-elf/tlslib.s
new file mode 100644
index 0000000..17c7707
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/tlslib.s
@@ -0,0 +1,6 @@
+ .text
+ /* Dummy. */
+ .globl __tls_get_addr
+ .type __tls_get_addr,@function
+__tls_get_addr:
+ ret