[binutils-gdb] ld: testsuite: Fix ld-elfvers tests on Solaris

Rainer Orth ro@sourceware.org
Tue Aug 19 13:39:30 GMT 2025


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=9ca011e55e76471a848a132ee3055a468feb4344

commit 9ca011e55e76471a848a132ee3055a468feb4344
Author: Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
Date:   Tue Aug 19 15:34:44 2025 +0200

    ld: testsuite: Fix ld-elfvers tests on Solaris
    
    All ld-elfvers tests FAIL on Solaris/SPARC, always with the same failure
    mode:
    
    FAIL: vers1
    
    ./ld-new: _etext: undefined version: vers1.so
    ./ld-new: _end: undefined version: vers1.so
    ./ld-new: _edata: undefined version: vers1.so
    ./ld-new: failed to set dynamic section sizes: bad value
    
    This is due to the use of --no-undefined-version, the error being
    emitted by bfd/elflink.c (bfd_elf_size_dynamic_sections).  The affected
    symbols are mandated by the Solaris ABI in versioned shared objects and
    are generated by ld/emultempl/solaris2.em
    (elf_solaris2_before_allocation).  The check in
    bfd_elf_size_dynamic_sections fails since for the base version (vers1.so),
    both symver and script are 0:
    
    vers1.so        pattern = "_etext", literal = 1, symver = 0, script = 0, mask = 1
    
    Given that those symbols are generated internally by ld, it seems
    sensible to set script = 1 for them.
    
    This patch does just that, at the same time enabling the tests for
    Solaris/x86.  Not doing this before looks like an oversight: there's no
    difference between SPARC and x86 in this regard.
    
    This introduces one failure on Solaris/amd64 (vers26b3), which I'll
    address in a followup.
    
    Tested no {sparc,sparcv9}-sun-solaris2.11, {i386,amd64}-pc-solaris2.11,
    and {x86_64,i686}-pc-linux-gnu.
    
    2025-07-25  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
    
            ld:
            * emultempl/solaris2.em (elf_solaris2_before_allocation): Mark
            global symbols as generated by linker script.
            * testsuite/ld-elfvers/vers.exp: Enable on *-*-solaris2* rather
            than sparc*-*-solaris2* only.

Diff:
---
 ld/emultempl/solaris2.em         | 5 +++++
 ld/testsuite/ld-elfvers/vers.exp | 4 ++--
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/ld/emultempl/solaris2.em b/ld/emultempl/solaris2.em
index 6198a82f24b..29a436eb53c 100644
--- a/ld/emultempl/solaris2.em
+++ b/ld/emultempl/solaris2.em
@@ -117,6 +117,11 @@ elf_solaris2_before_allocation (void)
 	  /* Create a version pattern for this symbol.  Some of them start
 	     off as local, others as global, so try both.  */
 	  globals = lang_new_vers_pattern (globals, *sym, NULL, true);
+
+	  /* Treat basever symbols as if from a linker script to
+	     appease --no-undefined-version.  */
+	  globals->script = 1;
+
 	  locals = lang_new_vers_pattern (locals, *sym, NULL, true);
 	}
 
diff --git a/ld/testsuite/ld-elfvers/vers.exp b/ld/testsuite/ld-elfvers/vers.exp
index d5cfc7532f6..0c553beb738 100644
--- a/ld/testsuite/ld-elfvers/vers.exp
+++ b/ld/testsuite/ld-elfvers/vers.exp
@@ -35,7 +35,8 @@ if { ![check_shared_lib_support] } {
 # This test can only be run on a couple of ELF platforms.
 # Square bracket expressions seem to confuse istarget.
 # This is similar to the test that is used in ld-shared, BTW.
-if { ![istarget hppa*64*-*-hpux*]
+if { ![istarget *-*-solaris2*]
+     && ![istarget hppa*64*-*-hpux*]
      && ![istarget hppa*-*-linux*]
      && ![istarget i?86-*-elf*]
      && ![istarget i?86-*-linux*]
@@ -48,7 +49,6 @@ if { ![istarget hppa*64*-*-hpux*]
      && ![istarget powerpc*-*-linux*]
      && ![istarget powerpc*-*-sysv4*]
      && ![istarget sparc*-*-elf]
-     && ![istarget sparc*-*-solaris2*]
      && ![istarget sparc*-*-linux*]
      && ![istarget aarch64*-*-linux*]
      && ![istarget arm*-*-linux*]


More information about the Binutils-cvs mailing list