mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2026-08-27 00:26:02 -04:00
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 <judge.packham@gmail.com>
Approved-By: Luis Machado <luis.machado.foss@gmail.com>
This commit is contained in:
parent
54a5f4322a
commit
0209006212
4 changed files with 60 additions and 3 deletions
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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
36
gdbsupport/configure
vendored
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue