diff options
-rw-r--r-- | gdb/ChangeLog | 11 | ||||
-rw-r--r-- | gdb/config.in | 3 | ||||
-rwxr-xr-x | gdb/configure | 2 | ||||
-rw-r--r-- | gdb/configure.ac | 2 | ||||
-rw-r--r-- | gdb/fbsd-nat.c | 75 | ||||
-rw-r--r-- | gdb/fbsd-nat.h | 5 |
6 files changed, 96 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2db5abc..7f46c4a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2021-06-14 John Baldwin <jhb@FreeBSD.org> + + * configure.ac: Check for <sys/procctl.h>. + * config.in, configure: Regenerate. + * fbsd-nat.c: Include <sys/procctl.h> if present. + [PROC_ASLR_CTL] (maybe_disable_address_space_randomization): New. + (fbsd_nat_target::create_inferior) + (fbsd_nat_target::supports_disable_randomization): New. + * fbsd-nat.h (fbsd_nat_target::create_inferior) + (fbsd_nat_target::supports_disable_randomization): New. + 2021-06-14 Bernd Edlinger <bernd.edlinger@hotmail.de> * compile/compile.c: Include missing header signal.h. diff --git a/gdb/config.in b/gdb/config.in index 99c924f..9342604 100644 --- a/gdb/config.in +++ b/gdb/config.in @@ -486,6 +486,9 @@ /* Define to 1 if you have the <sys/poll.h> header file. */ #undef HAVE_SYS_POLL_H +/* Define to 1 if you have the <sys/procctl.h> header file. */ +#undef HAVE_SYS_PROCCTL_H + /* Define to 1 if you have the <sys/procfs.h> header file. */ #undef HAVE_SYS_PROCFS_H diff --git a/gdb/configure b/gdb/configure index 3d3977b..c6b5906 100755 --- a/gdb/configure +++ b/gdb/configure @@ -12260,7 +12260,7 @@ fi for ac_header in nlist.h machine/reg.h \ thread_db.h \ sys/file.h sys/filio.h sys/ioctl.h sys/param.h \ - sys/resource.h sys/ptrace.h ptrace.h \ + sys/procctl.h sys/resource.h sys/ptrace.h ptrace.h \ sys/reg.h sys/debugreg.h \ termios.h elf_hp.h do : diff --git a/gdb/configure.ac b/gdb/configure.ac index df340ff..68cf84d 100644 --- a/gdb/configure.ac +++ b/gdb/configure.ac @@ -1298,7 +1298,7 @@ AC_HEADER_STDC AC_CHECK_HEADERS([nlist.h machine/reg.h \ thread_db.h \ sys/file.h sys/filio.h sys/ioctl.h sys/param.h \ - sys/resource.h sys/ptrace.h ptrace.h \ + sys/procctl.h sys/resource.h sys/ptrace.h ptrace.h \ sys/reg.h sys/debugreg.h \ termios.h elf_hp.h]) AC_CHECK_HEADERS(sys/user.h, [], [], diff --git a/gdb/fbsd-nat.c b/gdb/fbsd-nat.c index 581c04d..234e74f 100644 --- a/gdb/fbsd-nat.c +++ b/gdb/fbsd-nat.c @@ -29,6 +29,9 @@ #include "gdbsupport/gdb_wait.h" #include "inf-ptrace.h" #include <sys/types.h> +#ifdef HAVE_SYS_PROCCTL_H +#include <sys/procctl.h> +#endif #include <sys/procfs.h> #include <sys/ptrace.h> #include <sys/signal.h> @@ -1401,6 +1404,68 @@ fbsd_nat_target::supports_stopped_by_sw_breakpoint () } #endif +#ifdef PROC_ASLR_CTL +class maybe_disable_address_space_randomization +{ +public: + explicit maybe_disable_address_space_randomization (bool disable_randomization) + { + if (disable_randomization) + { + if (procctl (P_PID, getpid (), PROC_ASLR_STATUS, &m_aslr_ctl) == -1) + { + warning (_("Failed to fetch current address space randomization " + "status: %s"), safe_strerror (errno)); + return; + } + + m_aslr_ctl &= ~PROC_ASLR_ACTIVE; + if (m_aslr_ctl == PROC_ASLR_FORCE_DISABLE) + return; + + int ctl = PROC_ASLR_FORCE_DISABLE; + if (procctl (P_PID, getpid (), PROC_ASLR_CTL, &ctl) == -1) + { + warning (_("Error disabling address space randomization: %s"), + safe_strerror (errno)); + return; + } + + m_aslr_ctl_set = true; + } + } + + ~maybe_disable_address_space_randomization () + { + if (m_aslr_ctl_set) + { + if (procctl (P_PID, getpid (), PROC_ASLR_CTL, &m_aslr_ctl) == -1) + warning (_("Error restoring address space randomization: %s"), + safe_strerror (errno)); + } + } + + DISABLE_COPY_AND_ASSIGN (maybe_disable_address_space_randomization); + +private: + bool m_aslr_ctl_set = false; + int m_aslr_ctl = 0; +}; +#endif + +void +fbsd_nat_target::create_inferior (const char *exec_file, + const std::string &allargs, + char **env, int from_tty) +{ +#ifdef PROC_ASLR_CTL + maybe_disable_address_space_randomization restore_aslr_ctl + (disable_randomization); +#endif + + inf_ptrace_target::create_inferior (exec_file, allargs, env, from_tty); +} + #ifdef TDP_RFPPWAIT /* Target hook for follow_fork. On entry and at return inferior_ptid is the ptid of the followed inferior. */ @@ -1526,6 +1591,16 @@ fbsd_nat_target::supports_multi_process () return true; } +bool +fbsd_nat_target::supports_disable_randomization () +{ +#ifdef PROC_ASLR_CTL + return true; +#else + return false; +#endif +} + void _initialize_fbsd_nat (); void _initialize_fbsd_nat () diff --git a/gdb/fbsd-nat.h b/gdb/fbsd-nat.h index 772655d..1fdb939 100644 --- a/gdb/fbsd-nat.h +++ b/gdb/fbsd-nat.h @@ -67,6 +67,9 @@ public: thread_control_capabilities get_thread_control_capabilities () override { return tc_schedlock; } + void create_inferior (const char *, const std::string &, + char **, int) override; + void resume (ptid_t, int, enum gdb_signal) override; ptid_t wait (ptid_t, struct target_waitstatus *, target_wait_flags) override; @@ -98,6 +101,8 @@ public: #endif bool supports_multi_process () override; + + bool supports_disable_randomization () override; }; #endif /* fbsd-nat.h */ |