commit:     d3ff3873e70681ffa0b26322c53ed76771bee191
Author:     mojyack <mojyack <AT> gmail <DOT> com>
AuthorDate: Thu Feb 20 07:25:41 2025 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Thu Feb 20 11:48:22 2025 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=d3ff3873

llvm-runtimes/libgcc: Generate libgcc_s.so ldscript

The shared library (libgcc.so.1.0) which we build is dynamically linked
to libunwind. That is sufficient for runtime linking (running binaries
which are linked dynamically against libgcc.so.1.0, like binary Rust
toolchains), which is able to resolve the transitive dependency on
libunwind. But that's not sufficient for linking new binaries, where
the link editor doesn't accept transitive dependencies.

To be able to build binaries with `clang -nostdlib -lgcc_s`, we need to
provide a linker script.

Signed-off-by: mojyack <mojyack <AT> gmail.com>
Closes: https://github.com/gentoo/gentoo/pull/40564
Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>

 ...c-20.1.0_rc2.ebuild => libgcc-19.1.7-r1.ebuild} | 22 ++++++++++++++++++++--
 llvm-runtimes/libgcc/libgcc-20.1.0_rc2.ebuild      | 21 +++++++++++++++++++--
 llvm-runtimes/libgcc/libgcc-21.0.0.9999.ebuild     | 21 +++++++++++++++++++--
 3 files changed, 58 insertions(+), 6 deletions(-)

diff --git a/llvm-runtimes/libgcc/libgcc-20.1.0_rc2.ebuild 
b/llvm-runtimes/libgcc/libgcc-19.1.7-r1.ebuild
similarity index 86%
copy from llvm-runtimes/libgcc/libgcc-20.1.0_rc2.ebuild
copy to llvm-runtimes/libgcc/libgcc-19.1.7-r1.ebuild
index c1ca1f41c22a..d0a3126ebcf1 100644
--- a/llvm-runtimes/libgcc/libgcc-20.1.0_rc2.ebuild
+++ b/llvm-runtimes/libgcc/libgcc-19.1.7-r1.ebuild
@@ -13,6 +13,7 @@ HOMEPAGE="https://llvm.org/";
 
 LICENSE="Apache-2.0-with-LLVM-exceptions || ( UoI-NCSA MIT )"
 SLOT="0"
+KEYWORDS="~amd64"
 IUSE="debug test"
 
 DEPEND="
@@ -103,6 +104,21 @@ src_configure() {
        cmake_src_configure
 }
 
+# Usage: deps
+gen_ldscript() {
+       local output_format
+       output_format=$($(tc-getCC) ${CFLAGS} ${LDFLAGS} -Wl,--verbose 2>&1 | 
sed -n 's/^OUTPUT_FORMAT("\([^"]*\)",.*/\1/p')
+       [[ -n ${output_format} ]] && output_format="OUTPUT_FORMAT ( 
${output_format} )"
+
+       cat <<-END_LDSCRIPT
+/* GNU ld script
+   Include missing dependencies
+*/
+${output_format}
+GROUP ( $@ )
+END_LDSCRIPT
+}
+
 src_compile() {
        cmake_src_compile
 
@@ -135,6 +151,9 @@ src_compile() {
                -Wl,-soname,libgcc_s.so.1.0 \
                -lc -lunwind -shared \
                -o libgcc_s.so.1.0 || die
+       # Generate libgcc_s.so ldscript for inclusion of libunwind as a
+       # dependency so that `clang -lgcc_s` works out of the box.
+       gen_ldscript libgcc_s.so.1.0 libunwind.so.1.0 > libgcc_s.so || die
        cp "${rtlib}" libgcc.a || die
 }
 
@@ -147,9 +166,8 @@ src_test() {
 
 src_install() {
        local libdir=$(get_libdir)
-       dolib.so libgcc_s.so.1.0
+       dolib.so libgcc_s.so.1.0 libgcc_s.so
        dolib.a libgcc.a
        dosym libgcc_s.so.1.0 "/usr/${libdir}/libgcc_s.so.1"
-       dosym libgcc_s.so.1 "/usr/${libdir}/libgcc_s.so"
        dosym libunwind.a "/usr/${libdir}/libgcc_eh.a"
 }

diff --git a/llvm-runtimes/libgcc/libgcc-20.1.0_rc2.ebuild 
b/llvm-runtimes/libgcc/libgcc-20.1.0_rc2.ebuild
index c1ca1f41c22a..2c2ae9d40376 100644
--- a/llvm-runtimes/libgcc/libgcc-20.1.0_rc2.ebuild
+++ b/llvm-runtimes/libgcc/libgcc-20.1.0_rc2.ebuild
@@ -103,6 +103,21 @@ src_configure() {
        cmake_src_configure
 }
 
+# Usage: deps
+gen_ldscript() {
+       local output_format
+       output_format=$($(tc-getCC) ${CFLAGS} ${LDFLAGS} -Wl,--verbose 2>&1 | 
sed -n 's/^OUTPUT_FORMAT("\([^"]*\)",.*/\1/p')
+       [[ -n ${output_format} ]] && output_format="OUTPUT_FORMAT ( 
${output_format} )"
+
+       cat <<-END_LDSCRIPT
+/* GNU ld script
+   Include missing dependencies
+*/
+${output_format}
+GROUP ( $@ )
+END_LDSCRIPT
+}
+
 src_compile() {
        cmake_src_compile
 
@@ -135,6 +150,9 @@ src_compile() {
                -Wl,-soname,libgcc_s.so.1.0 \
                -lc -lunwind -shared \
                -o libgcc_s.so.1.0 || die
+       # Generate libgcc_s.so ldscript for inclusion of libunwind as a
+       # dependency so that `clang -lgcc_s` works out of the box.
+       gen_ldscript libgcc_s.so.1.0 libunwind.so.1.0 > libgcc_s.so || die
        cp "${rtlib}" libgcc.a || die
 }
 
@@ -147,9 +165,8 @@ src_test() {
 
 src_install() {
        local libdir=$(get_libdir)
-       dolib.so libgcc_s.so.1.0
+       dolib.so libgcc_s.so.1.0 libgcc_s.so
        dolib.a libgcc.a
        dosym libgcc_s.so.1.0 "/usr/${libdir}/libgcc_s.so.1"
-       dosym libgcc_s.so.1 "/usr/${libdir}/libgcc_s.so"
        dosym libunwind.a "/usr/${libdir}/libgcc_eh.a"
 }

diff --git a/llvm-runtimes/libgcc/libgcc-21.0.0.9999.ebuild 
b/llvm-runtimes/libgcc/libgcc-21.0.0.9999.ebuild
index c1ca1f41c22a..2c2ae9d40376 100644
--- a/llvm-runtimes/libgcc/libgcc-21.0.0.9999.ebuild
+++ b/llvm-runtimes/libgcc/libgcc-21.0.0.9999.ebuild
@@ -103,6 +103,21 @@ src_configure() {
        cmake_src_configure
 }
 
+# Usage: deps
+gen_ldscript() {
+       local output_format
+       output_format=$($(tc-getCC) ${CFLAGS} ${LDFLAGS} -Wl,--verbose 2>&1 | 
sed -n 's/^OUTPUT_FORMAT("\([^"]*\)",.*/\1/p')
+       [[ -n ${output_format} ]] && output_format="OUTPUT_FORMAT ( 
${output_format} )"
+
+       cat <<-END_LDSCRIPT
+/* GNU ld script
+   Include missing dependencies
+*/
+${output_format}
+GROUP ( $@ )
+END_LDSCRIPT
+}
+
 src_compile() {
        cmake_src_compile
 
@@ -135,6 +150,9 @@ src_compile() {
                -Wl,-soname,libgcc_s.so.1.0 \
                -lc -lunwind -shared \
                -o libgcc_s.so.1.0 || die
+       # Generate libgcc_s.so ldscript for inclusion of libunwind as a
+       # dependency so that `clang -lgcc_s` works out of the box.
+       gen_ldscript libgcc_s.so.1.0 libunwind.so.1.0 > libgcc_s.so || die
        cp "${rtlib}" libgcc.a || die
 }
 
@@ -147,9 +165,8 @@ src_test() {
 
 src_install() {
        local libdir=$(get_libdir)
-       dolib.so libgcc_s.so.1.0
+       dolib.so libgcc_s.so.1.0 libgcc_s.so
        dolib.a libgcc.a
        dosym libgcc_s.so.1.0 "/usr/${libdir}/libgcc_s.so.1"
-       dosym libgcc_s.so.1 "/usr/${libdir}/libgcc_s.so"
        dosym libunwind.a "/usr/${libdir}/libgcc_eh.a"
 }

Reply via email to