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" }
