summaryrefslogtreecommitdiff
path: root/gdb/linux-nat.c
diff options
context:
space:
mode:
authorJan Kratochvil <jan.kratochvil@redhat.com>2008-07-10 09:31:00 +0000
committerJan Kratochvil <jan.kratochvil@redhat.com>2008-07-10 09:31:00 +0000
commit7272de62c9f0070030e9cb8da7b9287b3dd5c57b (patch)
treedc12eab76e82dbd6ab296c2fa8eac3231383e9a2 /gdb/linux-nat.c
parent36c3689038f265604e6525c47e8bd5d20a4ad100 (diff)
downloadgdb-7272de62c9f0070030e9cb8da7b9287b3dd5c57b.tar.gz
gdb/
* NEWS (New commands): Mention "set disable-randomization". * configure.ac: Add check for HAVE_PERSONALITY and HAVE_DECL_ADDR_NO_RANDOMIZE. * configure, config.in: Regenerate. * linux-nat.c [HAVE_PERSONALITY]: New include <sys/personality.h>. [HAVE_PERSONALITY] [!HAVE_DECL_ADDR_NO_RANDOMIZE]: Set ADDR_NO_RANDOMIZE. (disable_randomization, show_disable_randomization) (set_disable_randomization): New. (linux_nat_create_inferior) [HAVE_PERSONALITY]: New variables PERSONALITY_ORIG and PERSONALITY_SET. Disable randomization upon the variable DISABLE_RANDOMIZATION. (_initialize_linux_nat): Call ADD_SETSHOW_BOOLEAN_CMD for the variable DISABLE_RANDOMIZATION. gdb/doc/ * gdb.texinfo (Starting): Document "set disable-randomization". gdb/testsuite/ * gdb.base/randomize.exp, gdb.base/randomize.c: New files.
Diffstat (limited to 'gdb/linux-nat.c')
-rw-r--r--gdb/linux-nat.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
index beec018d7f6..b7ecb1e459c 100644
--- a/gdb/linux-nat.c
+++ b/gdb/linux-nat.c
@@ -50,6 +50,13 @@
#include "event-loop.h"
#include "event-top.h"
+#ifdef HAVE_PERSONALITY
+# include <sys/personality.h>
+# if !HAVE_DECL_ADDR_NO_RANDOMIZE
+# define ADDR_NO_RANDOMIZE 0x0040000
+# endif
+#endif /* HAVE_PERSONALITY */
+
/* This comment documents high-level logic of this file.
Waiting for events in sync mode
@@ -220,6 +227,33 @@ show_debug_linux_nat_async (struct ui_file *file, int from_tty,
value);
}
+static int disable_randomization = 1;
+
+static void
+show_disable_randomization (struct ui_file *file, int from_tty,
+ struct cmd_list_element *c, const char *value)
+{
+#ifdef HAVE_PERSONALITY
+ fprintf_filtered (file, _("\
+Disabling randomization of debuggee's virtual address space is %s.\n"),
+ value);
+#else /* !HAVE_PERSONALITY */
+ fputs_filtered (_("\
+Disabling randomization of debuggee's virtual address space is unsupported on\n\
+this platform.\n"), file);
+#endif /* !HAVE_PERSONALITY */
+}
+
+static void
+set_disable_randomization (char *args, int from_tty, struct cmd_list_element *c)
+{
+#ifndef HAVE_PERSONALITY
+ error (_("\
+Disabling randomization of debuggee's virtual address space is unsupported on\n\
+this platform."));
+#endif /* !HAVE_PERSONALITY */
+}
+
static int linux_parent_pid;
struct simple_pid_list
@@ -1279,6 +1313,9 @@ linux_nat_create_inferior (char *exec_file, char *allargs, char **env,
int from_tty)
{
int saved_async = 0;
+#ifdef HAVE_PERSONALITY
+ int personality_orig = 0, personality_set = 0;
+#endif /* HAVE_PERSONALITY */
/* The fork_child mechanism is synchronous and calls target_wait, so
we have to mask the async mode. */
@@ -1302,8 +1339,36 @@ linux_nat_create_inferior (char *exec_file, char *allargs, char **env,
the inferior execing. */
linux_nat_async_events (sigchld_default);
+#ifdef HAVE_PERSONALITY
+ if (disable_randomization)
+ {
+ errno = 0;
+ personality_orig = personality (0xffffffff);
+ if (errno == 0 && !(personality_orig & ADDR_NO_RANDOMIZE))
+ {
+ personality_set = 1;
+ personality (personality_orig | ADDR_NO_RANDOMIZE);
+ }
+ if (errno != 0 || (personality_set
+ && !(personality (0xffffffff) & ADDR_NO_RANDOMIZE)))
+ warning (_("Error disabling address space randomization: %s"),
+ safe_strerror (errno));
+ }
+#endif /* HAVE_PERSONALITY */
+
linux_ops->to_create_inferior (exec_file, allargs, env, from_tty);
+#ifdef HAVE_PERSONALITY
+ if (personality_set)
+ {
+ errno = 0;
+ personality (personality_orig);
+ if (errno != 0)
+ warning (_("Error restoring address space randomization: %s"),
+ safe_strerror (errno));
+ }
+#endif /* HAVE_PERSONALITY */
+
if (saved_async)
linux_nat_async_mask (saved_async);
}
@@ -4378,6 +4443,17 @@ Tells gdb whether to control the GNU/Linux inferior in asynchronous mode."),
/* Install the default mode. */
linux_nat_set_async_mode (linux_async_permitted);
+
+ add_setshow_boolean_cmd ("disable-randomization", class_support,
+ &disable_randomization, _("\
+Set disabling of debuggee's virtual address space randomization."), _("\
+Show disabling of debuggee's virtual address space randomization."), _("\
+When this mode is on (which is the default), randomization of the virtual\n\
+address space is disabled. Standalone programs run with the randomization\n\
+enabled by default on some platforms."),
+ &set_disable_randomization,
+ &show_disable_randomization,
+ &setlist, &showlist);
}