From e4a41dc43a32ed4d43ca4ffbe099c14feb73c01d Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Thu, 15 Jan 2026 09:11:50 +0800 Subject: [PATCH] elf: Set has_local_dynsyms for forced local symbol bfd_elf_link_record_dynamic_symbol may be called by mips backend after a global symbol has been forced to local. Set has_local_dynsyms to true in this case. bfd/ PR ld/33793 * elflink.c (bfd_elf_link_record_dynamic_symbol): Set has_local_dynsyms to true for forced local symbol. ld/ PR ld/33793 * testsuite/ld-mips-elf/mips-elf.exp: Run pr33793. * testsuite/ld-mips-elf/pr33793.d: New file. * testsuite/ld-mips-elf/pr33793.s: Likewise. Signed-off-by: H.J. Lu --- bfd/elflink.c | 2 ++ ld/testsuite/ld-mips-elf/mips-elf.exp | 2 ++ ld/testsuite/ld-mips-elf/pr33793.d | 4 +++ ld/testsuite/ld-mips-elf/pr33793.s | 51 +++++++++++++++++++++++++++ 4 files changed, 59 insertions(+) create mode 100644 ld/testsuite/ld-mips-elf/pr33793.d create mode 100644 ld/testsuite/ld-mips-elf/pr33793.s diff --git a/bfd/elflink.c b/bfd/elflink.c index 64c1a57b465..fcb92c91af9 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -629,6 +629,8 @@ bfd_elf_link_record_dynamic_symbol (struct bfd_link_info *info, } h->dynindx = elf_hash_table (info)->dynsymcount; + if (h->forced_local) + elf_hash_table (info)->has_local_dynsyms = true; ++elf_hash_table (info)->dynsymcount; dynstr = elf_hash_table (info)->dynstr; diff --git a/ld/testsuite/ld-mips-elf/mips-elf.exp b/ld/testsuite/ld-mips-elf/mips-elf.exp index 38db5460176..c9e67324cf4 100644 --- a/ld/testsuite/ld-mips-elf/mips-elf.exp +++ b/ld/testsuite/ld-mips-elf/mips-elf.exp @@ -1782,6 +1782,8 @@ run_dump_test_o32 "global-local-symtab-final-o32" run_dump_test_n32 "global-local-symtab-final-n32" run_dump_test_n64 "global-local-symtab-final-n64" +run_dump_test "pr33793" + # Section ordering tests. foreach { abi } $abis { set ps2 [expr \ diff --git a/ld/testsuite/ld-mips-elf/pr33793.d b/ld/testsuite/ld-mips-elf/pr33793.d new file mode 100644 index 00000000000..fb944866fef --- /dev/null +++ b/ld/testsuite/ld-mips-elf/pr33793.d @@ -0,0 +1,4 @@ +#ld: -e __start +#readelf: -D -s + +Dynamic symbol information is not available for displaying symbols. diff --git a/ld/testsuite/ld-mips-elf/pr33793.s b/ld/testsuite/ld-mips-elf/pr33793.s new file mode 100644 index 00000000000..6a3f4787afe --- /dev/null +++ b/ld/testsuite/ld-mips-elf/pr33793.s @@ -0,0 +1,51 @@ + .abicalls + .text + .align 2 + .globl __tls_get_addr + .ent __tls_get_addr + .type __tls_get_addr, @function +__tls_get_addr: + .frame $sp,0,$31 + .mask 0x00000000,0 + .fmask 0x00000000,0 + .set noreorder + .set nomacro + jr $31 + nop + + .set macro + .set reorder + .end __tls_get_addr + .size __tls_get_addr, .-__tls_get_addr + .align 2 + .globl __start + .ent __start + .type __start, @function +__start: + .frame $sp,16,$31 + .mask 0x80000000,-4 + .fmask 0x00000000,0 + .set noreorder + .cpload $25 + .set nomacro + addiu $sp,$sp,-16 + lw $25,%call16(__tls_get_addr)($28) + addiu $4,$28,%tlsgd(var) + sw $31,12($sp) + .cprestore 0 + .reloc 1f,R_MIPS_JALR,__tls_get_addr +1: jalr $25 + nop + + lw $31,12($sp) + lw $2,0($2) + jr $31 + addiu $sp,$sp,16 + + .set macro + .set reorder + .end __start + .size __start, .-__start + .weak var + .hidden var + .section .note.GNU-stack,"",@progbits -- 2.47.3