[binutils-gdb] GDB: aarch64-linux: Fix build failure on musl systems

Thiago Bauermann via Gdb-cvs <[email protected]>
Newsgroups gmane.comp.gdb.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=02090062127d59978ccc312dabf63c6ea838cd85

commit 02090062127d59978ccc312dabf63c6ea838cd85
Author: Thiago Jung Bauermann <[email protected]>
Date:   Wed Feb 11 04:54:28 2026 +0000

    GDB: aarch64-linux: Fix build failure on musl systems
    
    When building against musl (e.g. on Alpine Linux), the following error
    happens:
    
        CXX    linux-aarch64-low.o
      In file included from /home/bauermann/src/binutils-gdb/gdbserver/linux-aarch64-low.cc:48:
      /home/bauermann/src/binutils-gdb/gdbserver/../gdb/nat/aarch64-gcs-linux.h:36:8: error: redefinition of 'struct user_gcs'
         36 | struct user_gcs
            |        ^~~~~~~~
      In file included from /home/bauermann/src/binutils-gdb/gdbserver/linux-aarch64-low.cc:36:
      /usr/include/asm/ptrace.h:329:8: note: previous definition of 'struct user_gcs'
        329 | struct user_gcs {
            |        ^~~~~~~~
      make[2]: *** [Makefile:565: linux-aarch64-low.o] Error 1
    
    aarch64-linux-tdep.c fails to build in the same way.  This happens because
    aarch64-gcs-linux-ptrace.h uses GCS_MAGIC to see whether the system headers
    have GCS-related definitions.  The problem is that GCS_MAGIC is defined in
    <asm/sigcontext.h> while struct gcs_user is defined in <asm/ptrace.h>.
    It's fine on glibc systems because in the set of system headers that
    linux-aarch64-low.cc and aarch64-linux-tdep.c include, <asm/sigcontext.h>
    ends up being included implicitly as well.  This doesn't happen when using
    musl's headers though.
    
    There isn't a macro in <asm/ptrace.h> whose presence is correlated with
    the presence of the struct user_gcs definition, so a configure check is
    needed to detect it and conditionally define the struct.
    
    Note that there's another build issue with musl, described in
    PR gdb/33747 affecting compilation of gdb/ser-unix.c.  In order to be
    able to test this patch, I applied the patch in comment 11 there.
    
    Tested with a native build on an Alpine Linux aarch64 system, and also
    verified that all gdb.arch/aarch64-gcs*.exp tests pass on it.
    
    Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33926
    Co-authored-by: Chris Packham <[email protected]>
    Approved-By: Luis Machado <[email protected]>

Diff:
---
 gdb/nat/aarch64-gcs-linux.h |  5 ++---
 gdbsupport/config.in        |  3 +++
 gdbsupport/configure        | 36 ++++++++++++++++++++++++++++++++++++
 gdbsupport/configure.ac     | 19 +++++++++++++++++++
 4 files changed, 60 insertions(+), 3 deletions(-)

diff --git a/gdb/nat/aarch64-gcs-linux.h b/gdb/nat/aarch64-gcs-linux.h
index 79e6dcaaaf1..f209c36e497 100644
--- a/gdb/nat/aarch64-gcs-linux.h
+++ b/gdb/nat/aarch64-gcs-linux.h
@@ -29,8 +29,7 @@
 #define HWCAP_GCS (1ULL << 32)
 #endif
 
-/* Make sure we only define these if the kernel header doesn't.  */
-#ifndef GCS_MAGIC
+#ifndef HAVE_STRUCT_USER_GCS
 
 /* GCS state (NT_ARM_GCS).  */
 
@@ -41,6 +40,6 @@ struct user_gcs
   uint64_t gcspr_el0;
 };
 
-#endif /* GCS_MAGIC */
+#endif /* HAVE_STRUCT_USER_GCS */
 
 #endif /* GDB_NAT_AARCH64_GCS_LINUX_H */
diff --git a/gdbsupport/config.in b/gdbsupport/config.in
index 0beacf22c05..2957ee0f030 100644
--- a/gdbsupport/config.in
+++ b/gdbsupport/config.in
@@ -271,6 +271,9 @@
 /* Define to 1 if `st_blocks' is a member of `struct stat'. */
 #undef HAVE_STRUCT_STAT_ST_BLOCKS
 
+/* Define to 1 if your system has struct user_gcs. */
+#undef HAVE_STRUCT_USER_GCS
+
 /* Define to 1 if you have the <sys/param.h> header file. */
 #undef HAVE_SYS_PARAM_H
 
diff --git a/gdbsupport/configure b/gdbsupport/configure
index 05ad00f48c4..584a80ef825 100755
--- a/gdbsupport/configure
+++ b/gdbsupport/configure
@@ -14307,6 +14307,42 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 
+# Check for `struct user_gcs`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct user_gcs" >&5
+$as_echo_n "checking for struct user_gcs... " >&6; }
+if ${gdb_cv_struct_user_gcs+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/ptrace.h>
+	 #include <asm/ptrace.h>
+int
+main ()
+{
+struct user_gcs u;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  gdb_cv_struct_user_gcs=yes
+else
+  gdb_cv_struct_user_gcs=no
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gdb_cv_struct_user_gcs" >&5
+$as_echo "$gdb_cv_struct_user_gcs" >&6; }
+if test "$gdb_cv_struct_user_gcs" = yes; then
+
+$as_echo "#define HAVE_STRUCT_USER_GCS 1" >>confdefs.h
+
+fi
+
 # Set the 'development' global.
 . $srcdir/../bfd/development.sh
 
diff --git a/gdbsupport/configure.ac b/gdbsupport/configure.ac
index 5491b8f3f10..6c06832f091 100644
--- a/gdbsupport/configure.ac
+++ b/gdbsupport/configure.ac
@@ -68,6 +68,25 @@ GDB_AC_PTRACE
 AM_GDB_COMPILER_TYPE
 AM_GDB_WARNINGS
 
+# Check for `struct user_gcs`
+AC_CACHE_CHECK(
+  [for struct user_gcs],
+  [gdb_cv_struct_user_gcs],
+  [AC_COMPILE_IFELSE(
+     [AC_LANG_PROGRAM(
+	[#include <sys/ptrace.h>
+	 #include <asm/ptrace.h>],
+	[struct user_gcs u;]
+      )],
+     [gdb_cv_struct_user_gcs=yes],
+     [gdb_cv_struct_user_gcs=no]
+  )]
+)
+if test "$gdb_cv_struct_user_gcs" = yes; then
+  AC_DEFINE(HAVE_STRUCT_USER_GCS, 1,
+	    [Define to 1 if your system has struct user_gcs.])
+fi
+
 # Set the 'development' global.
 . $srcdir/../bfd/development.sh
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.