GDB: aarch64-linux: Fix build failure on musl systems

(cherry picked from commit 0209006212)

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:42:
  /home/bauermann/src/binutils-gdb/gdbserver/../gdb/arch/aarch64-gcs-linux.h:35:8: error: redefinition of 'struct user_gcs'
     35 | struct user_gcs
        |        ^~~~~~~~
  In file included from /home/bauermann/src/binutils-gdb/gdbserver/linux-aarch64-low.cc:35:
  /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.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.

Also, this change requires aarch64-linux-tdep.c to stop using
struct user_gcs because target-dependent code can't include <asm/ptrace.h>
and thus even if HAVE_STRUCT_USER_GCS is set, the file won't have the
struct definition available. To fix this problem, also backport the
definition of AARCH64_LINUX_SIZEOF_GCS_REGSET and use it there.

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 <judge.packham@gmail.com>
Approved-By: Andrew Burgess <aburgess@redhat.com>
This commit is contained in:
Thiago Jung Bauermann 2026-02-11 04:54:28 +00:00
parent c1aec9d18e
commit 1ccc3f6a2e
5 changed files with 66 additions and 5 deletions

View file

@ -1684,8 +1684,9 @@ aarch64_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
gcs_regmap, regcache_supply_regset, regcache_collect_regset
};
cb (".reg-aarch-gcs", sizeof (user_gcs), sizeof (user_gcs),
&aarch64_linux_gcs_regset, "GCS registers", cb_data);
cb (".reg-aarch-gcs", AARCH64_LINUX_SIZEOF_GCS_REGSET,
AARCH64_LINUX_SIZEOF_GCS_REGSET, &aarch64_linux_gcs_regset,
"GCS registers", cb_data);
}
}

View file

@ -27,8 +27,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). */
@ -39,6 +38,9 @@ struct user_gcs
uint64_t gcspr_el0;
};
#endif /* GCS_MAGIC */
#endif /* HAVE_STRUCT_USER_GCS */
/* The GCS regset consists of 3 64-bit registers. */
#define AARCH64_LINUX_SIZEOF_GCS_REGSET (3 * 8)
#endif /* GDB_ARCH_AARCH64_GCS_LINUX_H */

View file

@ -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

36
gdbsupport/configure vendored
View file

@ -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

View file

@ -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