Reminder that, on aarch64 (tier 1), /lib/libgcc_s.so.1 is not an always valid replacement for using /usr/local/lib/gcc*/libgcc_s.so.1

Mark Millard <[email protected]>
Newsgroups gmane.os.freebsd.current
Message-ID <[email protected]>
I ran into a kib@  bugzilla comment and a gerald@ question in response
in a bugzilla I was looking at that prompted me to test the status of
this again.

QUOTES from https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=285711
[email protected] in a comment:

First wrong thing is that the backtrace ended up in gcc' libgcc_s.so.1 at all.
FreeBSD ABI assumes that /lib/libgcc_s.so.1 is used.

[email protected] in a later one of the comments:

I was wondering - if the system libgcc_s.so.1 is complete for all
platforms, maybe simply not install GCC's libgcc?
END QUOTES


The answer is "not complete": Retesting an old example:

# cat fp-binding-failure-aarch64.cpp 
#include <cmath>
volatile long double v=NAN;
int main()
{
    return std::isnan(v) ? 1 : 0;
}

# g++15 fp-binding-failure-aarch64.cpp
# ./a.out
ld-elf.so.1: /lib/libgcc_s.so.1: version GCC_4.5.0 required by /root/c_tests/a.out not found

(This does not happen for a C compile/link.
/usr/local/lib/gcc15/libstdc++.so.6 is involved
in why the above happens. Also I have 2022 Email
history showing the same sort of thing with g++11
in use instead with a different simple C++
program. See later for the modern result for
that as well.)

# ldd -a a.out
a.out:
	libstdc++.so.6 => /usr/local/lib/gcc15/libstdc++.so.6 (0x29cff5400000)
	libm.so.5 => /lib/libm.so.5 (0x29cffa7e0000)
	libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x29cff415d000)
	libc.so.7 => /lib/libc.so.7 (0x29cff7000000)
/usr/local/lib/gcc15/libstdc++.so.6:
	libm.so.5 => /lib/libm.so.5 (0x29cffa7e0000)
	libc.so.7 => /lib/libc.so.7 (0x29cff7000000)
	libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x29cff415d000)
/lib/libm.so.5:
	libc.so.7 => /lib/libc.so.7 (0x29cff7000000)
/lib/libgcc_s.so.1:
	libc.so.7 => /lib/libc.so.7 (0x29cff7000000)
/lib/libc.so.7:
	libsys.so.7 => /lib/libsys.so.7 (0x29d006fd0000)

vs.:

# g++15 -Wl,-rpath=/usr/local/lib/gcc15 fp-binding-failure-aarch64.cpp
# ./a.out
# ldd -a a.out
a.out:
	libstdc++.so.6 => /usr/local/lib/gcc15/libstdc++.so.6 (0x2fd57d000000)
	libm.so.5 => /lib/libm.so.5 (0x2fd587cb0000)
	libgcc_s.so.1 => /usr/local/lib/gcc15/libgcc_s.so.1 (0x2fd58f750000)
	libc.so.7 => /lib/libc.so.7 (0x2fd57de00000)
/usr/local/lib/gcc15/libstdc++.so.6:
	libm.so.5 => /lib/libm.so.5 (0x2fd587cb0000)
	libc.so.7 => /lib/libc.so.7 (0x2fd57de00000)
	libgcc_s.so.1 => /usr/local/lib/gcc15/libgcc_s.so.1 (0x2fd58f750000)
/lib/libm.so.5:
	libc.so.7 => /lib/libc.so.7 (0x2fd57de00000)
/usr/local/lib/gcc15/libgcc_s.so.1:
	libc.so.7 => /lib/libc.so.7 (0x2fd57de00000)
/lib/libc.so.7:
	libsys.so.7 => /lib/libsys.so.7 (0x2fd595480000)

For an example that is C++ code that would not compile
as C code:

# cat locale_failure_test.cpp
#include <iostream>
#include <locale>

int main()
{
        try {
                std::locale l = std::locale("en_US.UTF-8");
        }
        catch(std::exception const &e) {
                std::cerr << e.what() << std::endl;
        }
        catch(...) {
                std::cerr << "Unknown exception " << std::endl;
        }
}

gets:

# g++15 locale_failure_test.cpp 
# ./a.out
ld-elf.so.1: /lib/libgcc_s.so.1: version GCC_4.5.0 required by /usr/local/lib/gcc15/libstdc++.so.6 not found

Note the two span both an original program and a gcc* .so library:

) version GCC_4.5.0 required by /root/c_tests/a.out not found
vs.
) version GCC_4.5.0 required by /usr/local/lib/gcc15/libstdc++.so.6 not found

The issue is tied to not covering the requirements of the g++
code generator output. (I do not know if C code generation is
fully covered by /lib/libgcc_s.so.1  use for aarch64. It is not
for armv7 last I knew.)

I'm not claiming "version GCC_4.5.0" is the only issue for
/lib/libgcc_s.so.1 being insufficient to always use: it is
just an existence proof example.


The status has been long standing and may well be fine. I do
not know if "FreeBSD ABI assumes that /lib/libgcc_s.so.1 is
used" has a status sufficient to lead to updates dealing with
the likes of the above.


===
Mark Millard
marklmi at yahoo.com
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.