Commit 365a2248ae for qemu.org

commit 365a2248ae69f306fe7997fd966bcb1c16a08695
Author: Daniel P. Berrangé <berrange@redhat.com>
Date:   Thu Jan 8 14:14:07 2026 +0000

    meson: disable libatomic with GCC >= 16

    Historically it was required to ask for libatomic explicitly with
    -latomic, but with GCC >= 16 apps will get linked to libatomic
    whether they ask for it or not.

    This invalidates QEMU's check for atomic op support for int128
    which explicitly does NOT want to use the libatomic impl. As a
    result with GCC >= 16, QEMU is now getting linked to libatomic
    and is activating CONFIG_ATOMIC128. This in turn exposes a bug
    in GCC's libatomic.a static buld which is incompatible with the
    use of -static-pie leading to build failures like:

        /usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/16/libatomic.a(cas_16_.o): relocation R_X86_64_32 against hidden symbol `libat_compare_exchange_16_i1' can not be used when making a PIE object
        /usr/bin/ld: failed to set dynamic section sizes: bad value
    collect2: error: ld returned 1 exit status

    The newly introduced -fno-link-libatomic flag can be used to
    disable the new automatic linking of libatomic. Setting this in
    qemu_isa_flags early on ensures that the check for CONFIG_ATOMIC128
    still works correctly.

    Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
    Acked-by: Paolo Bonzini <pbonzini@redhat.com>
    Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
    Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
    Message-ID: <20260108141407.2151817-1-berrange@redhat.com>

diff --git a/meson.build b/meson.build
index db87358d62..56df08c10e 100644
--- a/meson.build
+++ b/meson.build
@@ -445,6 +445,15 @@ if host_arch in ['i386', 'x86_64']
   endif
 endif

+# GCC >= 16 automatically tries to link libatomic for all programs.
+#
+# QEMU explicitly does NOT want to use libatomic for int128 types.
+#
+# Later checks assume we won't get atomic ops for int128 without
+# explicitly asking for -latomic, so we must disable GCC's new
+# automatic linking with the new -fno-link-libatomic flag
+qemu_isa_flags += cc.get_supported_arguments('-fno-link-libatomic')
+
 qemu_common_flags = qemu_isa_flags + qemu_common_flags

 if get_option('prefer_static')