aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2021-06-14 14:28:26 -0700
committerJohn Baldwin <jhb@FreeBSD.org>2021-06-14 14:55:48 -0700
commit09db4332c6017ab57cd136788c48e5a81e3b9399 (patch)
treed0c6e194cab1c0161bd3c4b94f8980a6b5eb5614
parentc9923e71ff57ce6e824833560aae59057c6f5783 (diff)
downloadbinutils-09db4332c6017ab57cd136788c48e5a81e3b9399.zip
binutils-09db4332c6017ab57cd136788c48e5a81e3b9399.tar.gz
binutils-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.
-rw-r--r--gdb/ChangeLog11
-rw-r--r--gdb/config.in3
-rwxr-xr-xgdb/configure2
-rw-r--r--gdb/configure.ac2
-rw-r--r--gdb/fbsd-nat.c75
-rw-r--r--gdb/fbsd-nat.h5
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 */