diff options
author | John Baldwin <jhb@FreeBSD.org> | 2021-06-14 14:28:26 -0700 |
---|---|---|
committer | John Baldwin <jhb@FreeBSD.org> | 2021-06-14 14:55:48 -0700 |
commit | 09db4332c6017ab57cd136788c48e5a81e3b9399 (patch) | |
tree | d0c6e194cab1c0161bd3c4b94f8980a6b5eb5614 /gdb/fbsd-nat.c | |
parent | c9923e71ff57ce6e824833560aae59057c6f5783 (diff) | |
download | gdb-09db4332c6017ab57cd136788c48e5a81e3b9399.zip gdb-09db4332c6017ab57cd136788c48e5a81e3b9399.tar.gz gdb-09db4332c6017ab57cd136788c48e5a81e3b9399.tar.bz2 |
fbsd nat: Disable address space randomization when requested.
Use procctl(2) with PROC_ASLR_CTL to disable address space
randomization in the current gdb process before forking a child
process for a new inferior when address space randomization is
disabled.
gdb/ChangeLog:
* 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.
Diffstat (limited to 'gdb/fbsd-nat.c')
-rw-r--r-- | gdb/fbsd-nat.c | 75 |
1 files changed, 75 insertions, 0 deletions
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 () |