]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
ld: testsuite: Fix ld-elfvers tests on Solaris
authorRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
Tue, 19 Aug 2025 13:34:44 +0000 (15:34 +0200)
committerRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
Tue, 19 Aug 2025 13:34:44 +0000 (15:34 +0200)
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.

ld/emultempl/solaris2.em
ld/testsuite/ld-elfvers/vers.exp

index 6198a82f24b9c011891ab7f0cbf68250b6251f58..29a436eb53c0db6e9b1e6d58ba6dafad5f59d339 100644 (file)
@@ -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);
        }
 
index d5cfc7532f651337cb446a119856aafc35e7cf05..0c553beb738bcf74bb3f7e51488f376e6c5432b2 100644 (file)
@@ -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*]