From 43b7e92b0c73d693d3b656b84b2a1181e40477ca Mon Sep 17 00:00:00 2001 From: Gary Benson Date: Mon, 1 Oct 2018 10:37:39 +0100 Subject: [PATCH] Add workaround from gdbserver's gdb_proc_service.h to GDB This commit adds a workaround from gdbserver's gdb_proc_service.h to GDB's. It doesn't seem to have been needed on any glibc as far back as 2001, but it's possibly required for other C libraries so I've retained it. gdb/ChangeLog: * configure.ac: Check if sys/procfs.h defines elf_fpregset_t. (AC_CHECK_HEADERS): Check for linux/elf.h. * configure, config.in: Rebuild. * gdb_proc_service.h: Include linux/elf.h if sys/procfs.h doesn't define elf_fpregset_t. --- gdb/ChangeLog | 8 ++++++++ gdb/config.in | 6 ++++++ gdb/configure | 39 ++++++++++++++++++++++++++++++++++++++- gdb/configure.ac | 3 ++- gdb/gdb_proc_service.h | 9 +++++++++ 5 files changed, 63 insertions(+), 2 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 01ae3315de8..698c9b7b677 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2018-10-01 Gary Benson + + * configure.ac: Check if sys/procfs.h defines elf_fpregset_t. + (AC_CHECK_HEADERS): Check for linux/elf.h. + * configure, config.in: Rebuild. + * gdb_proc_service.h: Include linux/elf.h if sys/procfs.h + doesn't define elf_fpregset_t. + 2018-10-01 Gary Benson * gdb_proc_service.h: Whitespace change. diff --git a/gdb/config.in b/gdb/config.in index 01acda124b9..fc7c85923c8 100644 --- a/gdb/config.in +++ b/gdb/config.in @@ -156,6 +156,9 @@ /* Define if ELF support should be included. */ #undef HAVE_ELF +/* Define if has elf_fpregset_t. */ +#undef HAVE_ELF_FPREGSET_T + /* Define to 1 if you have the header file. */ #undef HAVE_ELF_HP_H @@ -261,6 +264,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_LIBUNWIND_IA64_H +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_ELF_H + /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_PERF_EVENT_H diff --git a/gdb/configure b/gdb/configure index a5d6e747e78..4a725f666d3 100755 --- a/gdb/configure +++ b/gdb/configure @@ -12165,7 +12165,7 @@ fi # elf_hp.h is for HP/UX 64-bit shared library support. for ac_header in nlist.h machine/reg.h poll.h sys/poll.h proc_service.h \ - thread_db.h \ + thread_db.h linux/elf.h \ sys/file.h sys/filio.h sys/ioctl.h sys/param.h \ sys/resource.h sys/procfs.h sys/ptrace.h ptrace.h \ sys/reg.h sys/debugreg.h sys/select.h \ @@ -14636,6 +14636,43 @@ $as_echo "#define HAVE_PSADDR_T 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bfd_cv_have_sys_procfs_type_psaddr_t" >&5 $as_echo "$bfd_cv_have_sys_procfs_type_psaddr_t" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for elf_fpregset_t in sys/procfs.h" >&5 +$as_echo_n "checking for elf_fpregset_t in sys/procfs.h... " >&6; } + if ${bfd_cv_have_sys_procfs_type_elf_fpregset_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#define _SYSCALL32 +/* Needed for new procfs interface on sparc-solaris. */ +#define _STRUCTURED_PROC 1 +#include +int +main () +{ +elf_fpregset_t avar + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + bfd_cv_have_sys_procfs_type_elf_fpregset_t=yes +else + bfd_cv_have_sys_procfs_type_elf_fpregset_t=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + if test $bfd_cv_have_sys_procfs_type_elf_fpregset_t = yes; then + +$as_echo "#define HAVE_ELF_FPREGSET_T 1" >>confdefs.h + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bfd_cv_have_sys_procfs_type_elf_fpregset_t" >&5 +$as_echo "$bfd_cv_have_sys_procfs_type_elf_fpregset_t" >&6; } + diff --git a/gdb/configure.ac b/gdb/configure.ac index 66fc6c633f3..a469d0a7939 100644 --- a/gdb/configure.ac +++ b/gdb/configure.ac @@ -1296,7 +1296,7 @@ fi AC_HEADER_STDC # elf_hp.h is for HP/UX 64-bit shared library support. AC_CHECK_HEADERS([nlist.h machine/reg.h poll.h sys/poll.h proc_service.h \ - thread_db.h \ + thread_db.h linux/elf.h \ sys/file.h sys/filio.h sys/ioctl.h sys/param.h \ sys/resource.h sys/procfs.h sys/ptrace.h ptrace.h \ sys/reg.h sys/debugreg.h sys/select.h \ @@ -1528,6 +1528,7 @@ if test "$ac_cv_header_sys_procfs_h" = yes; then BFD_HAVE_SYS_PROCFS_TYPE(prgregset32_t) BFD_HAVE_SYS_PROCFS_TYPE(lwpid_t) BFD_HAVE_SYS_PROCFS_TYPE(psaddr_t) + BFD_HAVE_SYS_PROCFS_TYPE(elf_fpregset_t) dnl Check for broken prfpregset_t type diff --git a/gdb/gdb_proc_service.h b/gdb/gdb_proc_service.h index 39f0e03c6f4..ee9358d054a 100644 --- a/gdb/gdb_proc_service.h +++ b/gdb/gdb_proc_service.h @@ -64,6 +64,15 @@ EXTERN_C_POP #include #endif +/* Not all platforms bring in via . If + wasn't enough to find elf_fpregset_t, try the kernel + headers also (but don't if we don't need to). */ +#ifndef HAVE_ELF_FPREGSET_T +# ifdef HAVE_LINUX_ELF_H +# include +# endif +#endif + EXTERN_C_PUSH /* Functions in this interface return one of these status codes. */ -- 2.30.2