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;
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"
}
--- /dev/null
+#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
--- /dev/null
+ .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
--- /dev/null
+#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
--- /dev/null
+ .text
+ /* Dummy. */
+ .globl __tls_get_addr
+ .type __tls_get_addr,@function
+__tls_get_addr:
+ ret