[PATCH v2 3/6] configure: Repurpose have-cc-with-libunwind for clang support
Sam James
sam@gentoo.org
Wed Mar 11 06:17:59 GMT 2026
Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
> The `have-cc-with-libunwind` check (and its corresponding macro
> HAVE_CC_WITH_LIBUNWIND) was historically specific to IA64, intended
> to supplement libgcc with libunwind. Since this logic is unused in
> current GCC configurations, this patch repurposes it to support
> clang-based toolchains that utilize LLVM's libunwind instead of
> libgcc_s.
>
> The configure script now detects if the compiler natively supports
> unwinding via `-lunwind`.
I was going to comment about this then checked the next patch :)
>
> Additionally, when this mode is enabled, `-lclang_rt.builtins` is
> explicitly added to the `libgcc_eh` definition. This is necessary
> because `links-dso-program` otherwise fails to link due to a missing
> `__gcc_personality_v0` symbol. It appears that clang does not
> automatically link the builtins providing this personality routine
> when `rlink-path` is actively used during the build.
Yes, we've ran into this before.
LGTM, thanks.
Reviewed-by: Sam James <sam@gentoo.org>
> ---
> Makeconfig | 6 ++++--
> Makerules | 3 ++-
> config.make.in | 1 -
> configure | 11 ++++++-----
> configure.ac | 9 +++++----
> support/Makefile | 2 +-
> 6 files changed, 18 insertions(+), 14 deletions(-)
>
> diff --git a/Makeconfig b/Makeconfig
> index 6a05e1d973..ea509dd3bc 100644
> --- a/Makeconfig
> +++ b/Makeconfig
> @@ -711,10 +711,12 @@ link-libc-static-tests = -Wl,--start-group $(common-objpfx)libc.a $(static-gnuli
> ifndef gnulib
> ifneq ($(have-cc-with-libunwind),yes)
> libunwind =
> + libgcc_s = -lgcc_s
> else
> - libunwind = -lunwind
> + libunwind = -lunwind $(libgcc-name)
> + libgcc_s = $(libunwind)
> endif
> -libgcc_eh := -Wl,--as-needed -lgcc_s $(libunwind) -Wl,--no-as-needed
> +libgcc_eh := -Wl,--as-needed $(libgcc_s) -Wl,--no-as-needed
> gnulib-arch =
> gnulib = $(libgcc-name) $(gnulib-arch)
> gnulib-tests := $(libgcc-name) $(libgcc_eh)
> diff --git a/Makerules b/Makerules
> index 30c3559a28..180cbee251 100644
> --- a/Makerules
> +++ b/Makerules
> @@ -565,7 +565,8 @@ $(LINK.o) -shared -static-libgcc $(sysdep-LDFLAGS) $(rtld-LDFLAGS) \
> -B$(csu-objpfx) $(load-map-file) \
> $(LDFLAGS.so) $(LDFLAGS-$(@F:%.so=%).so) \
> $(link-test-modules-rpath-link) \
> - -L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link)
> + -L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link) \
> + $(libgcc_eh)
> endef
>
> # This macro is similar to build-shlib but it does not define a soname
> diff --git a/config.make.in b/config.make.in
> index fca75ab5d3..42889716e4 100644
> --- a/config.make.in
> +++ b/config.make.in
> @@ -69,7 +69,6 @@ no-fortify-source = @no_fortify_source@
> have-selinux = @have_selinux@
> have-libaudit = @have_libaudit@
> have-libcap = @have_libcap@
> -have-cc-with-libunwind = @libc_cv_cc_with_libunwind@
> bind-now = @bindnow@
> have-cxx-thread_local = @libc_cv_cxx_thread_local@
> have-loop-to-function = @libc_cv_cc_loop_to_function@
> diff --git a/configure b/configure
> index 672b1abad8..d156912063 100755
> --- a/configure
> +++ b/configure
> @@ -7069,18 +7069,17 @@ if test $libc_cv_have_sdata_section = yes; then
>
> fi
>
> -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libunwind-support in compiler" >&5
> -printf %s "checking for libunwind-support in compiler... " >&6; }
> +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler links with libunwind" >&5
> +printf %s "checking whether the compiler links with libunwind... " >&6; }
> if test ${libc_cv_cc_with_libunwind+y}
> then :
> printf %s "(cached) " >&6
> else case e in #(
> - e)
> - cat > conftest.c <<EOF
> + e) cat > conftest.c <<EOF
> int main (void) { return 0; }
> EOF
> if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -static -o conftest \
> - conftest.c -v 2>&1 >/dev/null | grep ' -lunwind ' >/dev/null; then
> + conftest.c -v 2>&1 >/dev/null | grep 'libunwind.a' >/dev/null; then
> libc_cv_cc_with_libunwind=yes
> else
> libc_cv_cc_with_libunwind=no
> @@ -7095,6 +7094,8 @@ if test $libc_cv_cc_with_libunwind = yes; then
> printf "%s\n" "#define HAVE_CC_WITH_LIBUNWIND 1" >>confdefs.h
>
> fi
> +config_vars="$config_vars
> +have-cc-with-libunwind = $libc_cv_cc_with_libunwind"
>
> ASFLAGS_config=
> { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether --noexecstack is desirable for .S files" >&5
> diff --git a/configure.ac b/configure.ac
> index aa50f28e60..776695486a 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -1289,13 +1289,13 @@ if test $libc_cv_have_sdata_section = yes; then
> AC_DEFINE(HAVE_SDATA_SECTION)
> fi
>
> -AC_CACHE_CHECK(for libunwind-support in compiler,
> - libc_cv_cc_with_libunwind, [
> - cat > conftest.c <<EOF
> +AC_CACHE_CHECK(whether the compiler links with libunwind,
> + libc_cv_cc_with_libunwind, [dnl
> +cat > conftest.c <<EOF
> int main (void) { return 0; }
> EOF
> if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -static -o conftest \
> - conftest.c -v 2>&1 >/dev/null | grep ' -lunwind ' >/dev/null; then
> + conftest.c -v 2>&1 >/dev/null | grep 'libunwind.a' >/dev/null; then
> libc_cv_cc_with_libunwind=yes
> else
> libc_cv_cc_with_libunwind=no
> @@ -1305,6 +1305,7 @@ AC_SUBST(libc_cv_cc_with_libunwind)
> if test $libc_cv_cc_with_libunwind = yes; then
> AC_DEFINE(HAVE_CC_WITH_LIBUNWIND)
> fi
> +LIBC_CONFIG_VAR([have-cc-with-libunwind], [$libc_cv_cc_with_libunwind])
>
> ASFLAGS_config=
> AC_CACHE_CHECK(whether --noexecstack is desirable for .S files,
> diff --git a/support/Makefile b/support/Makefile
> index b83350180c..1dae2802cf 100644
> --- a/support/Makefile
> +++ b/support/Makefile
> @@ -319,7 +319,7 @@ LINKS_DSO_PROGRAM = links-dso-program-c
> LDLIBS-links-dso-program-c = $(gnulib)
> ifeq ($(have-libgcc_s),yes)
> CFLAGS-links-dso-program-c.c += -fexceptions
> -LDLIBS-links-dso-program-c += -lgcc_s $(libunwind)
> +LDLIBS-links-dso-program-c += $(libgcc_s) $(libunwind)
> endif
> else
> LINKS_DSO_PROGRAM = links-dso-program
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 418 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/libc-alpha/attachments/20260311/4edaef41/attachment.sig>
More information about the Libc-alpha
mailing list