From: Rainer Orth Date: Tue, 19 Aug 2025 13:34:44 +0000 (+0200) Subject: ld: testsuite: Fix ld-elfvers tests on Solaris X-Git-Tag: gdb-17-branchpoint~252 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9ca011e55e76471a848a132ee3055a468feb4344;p=thirdparty%2Fbinutils-gdb.git 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 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 --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*]