diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2017-12-11 02:32:26 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2017-12-11 02:32:26 +0100 |
commit | 0ca198f1f90071a054287c204a3fd1b4ea315e18 (patch) | |
tree | 710b923b98b58c4e5f9546bb18b085baf9288c9e | |
parent | a8fecd7be76342fea85b5129d450ab01738dcbdf (diff) | |
download | hurd-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.c | 13 | ||||
-rw-r--r-- | exec/exec.c | 5 | ||||
-rw-r--r-- | hurd/process.defs | 10 | ||||
-rw-r--r-- | hurd/process_reply.defs | 3 | ||||
-rw-r--r-- | hurd/process_request.defs | 3 | ||||
-rw-r--r-- | proc/mgt.c | 18 | ||||
-rw-r--r-- | proc/proc.h | 1 |
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 */ @@ -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 */ |