Committed this one first after passing the gcc/binutils regressions of riscv-gnu-toolchain. Nelson On Wed, Feb 21, 2024 at 8:49 AM Nelson Chu wrote: > Oops I lost this one. This seems to fix the redundant dynamic > R_RISCV_NONE in .rela.dyn if using --no-pie for tls gd and ie, so looks > good to me. > > Btw, I just noticed that I also reviewed four of the TLS patches since my > mail box looks weird and only shows the old patches, so I lost this one and > others... I will see the remaining stuff. > > Thanks > Nelson > > On Fri, Sep 1, 2023 at 1:13 AM Tatsuyuki Ishi > wrote: > >> The previous code did not account correctly for two cases: >> * A TLS symbol can be referenced with multiple TLS types (although rare), >> in which case it only allocated the maximum slot size among the types, >> instead of the sum. >> * TLS relocations are only needed for DLLs, unlike normal symbols which >> requires relocations for all PIE code. >> >> Modify the logic to account for the two cases. >> >> bfd/ >> * elfnn-riscv.c (riscv_elf_size_dynamic_sections): Handle relocation >> sizing for TLS and non-TLS symbols differently, with the former >> requiring relocs on DLL while the latter requiring on PIE. >> Allocate GOT slots and relocation slots for each TLS type separately, >> accounting for the possibility of a TLS variable getting referenced by >> multiple symbols. >> ld/ >> * testsuite/ld-riscv-elf/ld-riscv-elf.exp: Updated. >> * testsuite/ld-riscv-elf/tls*: New testcase for TLS GD and IE, with >> symbols referred by both types and global and local symbols. >> --- >> v2: Add tests for GD and IE, testing both global and local symbols. >> Both -shared and -no-pie are tested. >> >> bfd/elfnn-riscv.c | 27 ++++++++++++++++----- >> ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp | 8 +++++++ >> ld/testsuite/ld-riscv-elf/tls.d | 15 ++++++++++++ >> ld/testsuite/ld-riscv-elf/tls.s | 28 ++++++++++++++++++++++ >> ld/testsuite/ld-riscv-elf/tlsbin.d | 7 ++++++ >> ld/testsuite/ld-riscv-elf/tlslib.s | 6 +++++ >> 6 files changed, 85 insertions(+), 6 deletions(-) >> create mode 100644 ld/testsuite/ld-riscv-elf/tls.d >> create mode 100644 ld/testsuite/ld-riscv-elf/tls.s >> create mode 100644 ld/testsuite/ld-riscv-elf/tlsbin.d >> create mode 100644 ld/testsuite/ld-riscv-elf/tlslib.s >> >> diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c >> index 09aa7be225e..02b46835cc7 100644 >> --- a/bfd/elfnn-riscv.c >> +++ b/bfd/elfnn-riscv.c >> @@ -1562,12 +1562,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 947a266ba72..adb4ee75e4a 100644 >> --- a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp >> +++ b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp >> @@ -317,4 +317,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 00000000000..0e2ab5683ad >> --- /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 >> \ No newline at end of file >> diff --git a/ld/testsuite/ld-riscv-elf/tls.s >> b/ld/testsuite/ld-riscv-elf/tls.s >> new file mode 100644 >> index 00000000000..79e9bc20374 >> --- /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 00000000000..12a4d0ea703 >> --- /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 >> \ No newline at end of file >> diff --git a/ld/testsuite/ld-riscv-elf/tlslib.s >> b/ld/testsuite/ld-riscv-elf/tlslib.s >> new file mode 100644 >> index 00000000000..17c770786d0 >> --- /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 >> -- >> 2.42.0 >> >>