mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-04-12 14:33:06 +08:00
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.
This commit is contained in:
parent
c9923e71ff
commit
09db4332c6
@ -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.
|
||||
|
@ -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
|
||||
|
||||
|
2
gdb/configure
vendored
2
gdb/configure
vendored
@ -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 :
|
||||
|
@ -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, [], [],
|
||||
|
@ -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 ()
|
||||
|
@ -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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user