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 > >