aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2017-12-11 02:32:26 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2017-12-11 02:32:26 +0100
commit0ca198f1f90071a054287c204a3fd1b4ea315e18 (patch)
tree710b923b98b58c4e5f9546bb18b085baf9288c9e
parenta8fecd7be76342fea85b5129d450ab01738dcbdf (diff)
downloadhurd-0ca198f1f90071a054287c204a3fd1b4ea315e18.tar.gz
hurd-0ca198f1f90071a054287c204a3fd1b4ea315e18.tar.bz2
hurd-0ca198f1f90071a054287c204a3fd1b4ea315e18.zip
Record executable entry for PIE core dumps
* hurd/process.defs (proc_set_entry, proc_get_entry): New RPCs. * hurd/process_reply.defs: Add skips for proc_set_entry, proc_get_entry. * hurd/process_request.defs: Likewise. * exec/exec.c (do_exec): Call proc_set_entry. * proc/proc.h (proc): Add p_entry field. * proc/mgt.c (S_proc_set_entry, S_proc_get_entry): New RPC implementations. * exec/elfcore.c (dump_core): Add at_entry note, call proc_get_entry to get it, and write it with WRITE_NOTE.
-rw-r--r--exec/elfcore.c13
-rw-r--r--exec/exec.c5
-rw-r--r--hurd/process.defs10
-rw-r--r--hurd/process_reply.defs3
-rw-r--r--hurd/process_request.defs3
-rw-r--r--proc/mgt.c18
-rw-r--r--proc/proc.h1
7 files changed, 53 insertions, 0 deletions
diff --git a/exec/elfcore.c b/exec/elfcore.c
index 12ecf34f..2dd499bf 100644
--- a/exec/elfcore.c
+++ b/exec/elfcore.c
@@ -331,6 +331,7 @@ dump_core (task_t task, file_t file, off_t corelimit,
{
DEFINE_NOTE (psinfo_t) psinfo;
DEFINE_NOTE (pstatus_t) pstatus;
+ DEFINE_NOTE (ElfW(auxv_t)) at_entry;
int flags = PI_FETCH_TASKINFO | PI_FETCH_THREADS | PI_FETCH_THREAD_BASIC;
char *waits = 0;
mach_msg_type_number_t num_waits = 0;
@@ -410,6 +411,18 @@ dump_core (task_t task, file_t file, off_t corelimit,
err = proc_get_arg_locations (proc,
&psinfo.data.pr_argv,
&psinfo.data.pr_envp);
+ if (err == 0)
+ {
+ /* Write position of executable. */
+ vm_address_t addr;
+ err = proc_get_entry (proc, &addr);
+ if (err == 0)
+ {
+ at_entry.data.a_type = AT_ENTRY;
+ at_entry.data.a_un.a_val = addr;
+ err = WRITE_NOTE (NT_AUXV, at_entry);
+ }
+ }
mach_port_deallocate (mach_task_self (), proc);
}
{
diff --git a/exec/exec.c b/exec/exec.c
index d78c54c5..2d74ee1c 100644
--- a/exec/exec.c
+++ b/exec/exec.c
@@ -1234,6 +1234,11 @@ do_exec (file_t file,
goto out;
set_name (newtask, argv, pid);
+
+ e.error = proc_set_entry (boot->portarray[INIT_PORT_PROC],
+ e.entry);
+ if (e.error)
+ goto out;
}
else
set_name (newtask, argv, 0);
diff --git a/hurd/process.defs b/hurd/process.defs
index c395705d..725326a4 100644
--- a/hurd/process.defs
+++ b/hurd/process.defs
@@ -416,3 +416,13 @@ routine proc_make_task_namespace (
skip; /* proc_set_exe */
skip; /* proc_get_exe */
+
+/* Set the locations of the executable entry. */
+routine proc_set_entry (
+ process: process_t;
+ entry: vm_address_t);
+
+/* Fetch the locations of the executable entry. */
+routine proc_get_entry (
+ process: process_t;
+ out entry: vm_address_t);
diff --git a/hurd/process_reply.defs b/hurd/process_reply.defs
index 84621e8a..2eefcc37 100644
--- a/hurd/process_reply.defs
+++ b/hurd/process_reply.defs
@@ -197,3 +197,6 @@ skip; /* proc_make_task_namespace */
skip; /* proc_set_exe */
skip; /* proc_get_exe */
+
+skip; /* proc_set_entry */
+skip; /* proc_get_entry */
diff --git a/hurd/process_request.defs b/hurd/process_request.defs
index e5518f06..fc9127ab 100644
--- a/hurd/process_request.defs
+++ b/hurd/process_request.defs
@@ -420,3 +420,6 @@ simpleroutine proc_make_task_namespace_request (
skip; /* proc_set_exe */
skip; /* proc_get_exe */
+
+skip; /* proc_set_entry */
+skip; /* proc_get_entry */
diff --git a/proc/mgt.c b/proc/mgt.c
index 750073a0..354f3784 100644
--- a/proc/mgt.c
+++ b/proc/mgt.c
@@ -348,6 +348,24 @@ S_proc_get_arg_locations (struct proc *p,
return 0;
}
+/* Implement proc_set_entry as described in <hurd/process.defs>. */
+kern_return_t
+S_proc_set_entry (struct proc *p, vm_address_t entry)
+{
+ if (!p)
+ return EOPNOTSUPP;
+ p->p_entry = entry;
+ return 0;
+}
+
+/* Implement proc_get_entry as described in <hurd/process.defs>. */
+kern_return_t
+S_proc_get_entry (struct proc *p, vm_address_t *entry)
+{
+ *entry = p->p_entry;
+ return 0;
+}
+
/* Implement proc_dostop as described in <hurd/process.defs>. */
kern_return_t
S_proc_dostop (struct proc *p,
diff --git a/proc/proc.h b/proc/proc.h
index 333e8840..b33845d9 100644
--- a/proc/proc.h
+++ b/proc/proc.h
@@ -71,6 +71,7 @@ struct proc
vm_address_t p_argv, p_envp;
vm_address_t start_code; /* all executable segments are in this range */
vm_address_t end_code;
+ vm_address_t p_entry; /* executable entry */
int p_status; /* to return via wait */
int p_sigcode;
struct rusage p_rusage; /* my usage if I'm dead, to return via wait */