]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
elf: Set has_local_dynsyms for forced local symbol
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 15 Jan 2026 01:11:50 +0000 (09:11 +0800)
committerH.J. Lu <hjl.tools@gmail.com>
Sat, 24 Jan 2026 04:10:36 +0000 (12:10 +0800)
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 <hjl.tools@gmail.com>
bfd/elflink.c
ld/testsuite/ld-mips-elf/mips-elf.exp
ld/testsuite/ld-mips-elf/pr33793.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/pr33793.s [new file with mode: 0644]

index 64c1a57b465ccec9dcd22bf48947bf29b30de77d..fcb92c91af98ac9bc91872981030b31a9656db06 100644 (file)
@@ -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;
index 38db5460176678a8114a338918f974537d4c638a..c9e67324cf49c75bd7c263da54743f72f27e5de3 100644 (file)
@@ -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 (file)
index 0000000..fb94486
--- /dev/null
@@ -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 (file)
index 0000000..6a3f478
--- /dev/null
@@ -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