Keep track of the range where executable segments are mapped into memory and hand that information over to the proc server.
* exec/priv.h (struct execdata): Add {start,end}_code. * exec/exec.c (prepare): Initialize {start,end}_code. (load_section): Update {start,end}_code. (do_exec): Use proc_set_code to hand {start,end}_code to the proc server. --- exec/exec.c | 23 +++++++++++++++++++++++ exec/priv.h | 4 ++++ 2 files changed, 27 insertions(+) diff --git a/exec/exec.c b/exec/exec.c index 30a5e00..de796f9 100644 --- a/exec/exec.c +++ b/exec/exec.c @@ -289,6 +289,17 @@ load_section (void *section, struct execdata *u) } } + /* If this segment is executable, adjust start_code and end_code + so that this mapping is within that range. */ + if (vm_prot & VM_PROT_EXECUTE) + { + if (u->start_code == 0 || u->start_code > addr) + u->start_code = addr; + + if (u->end_code < addr + memsz) + u->end_code = addr + memsz; + } + if (mapstart > addr) { /* We must read and copy in the space in the section before the @@ -732,6 +743,9 @@ prepare (file_t file, struct execdata *e) e->interp.section = NULL; + e->start_code = 0; + e->end_code = 0; + /* Initialize E's stdio stream. */ prepare_stream (e); @@ -1851,6 +1865,15 @@ do_exec (file_t file, } boot->user_entry = e.entry; /* already adjusted in `load' */ + /* Set the start_code and end_code values for this process. + /hurd/exec is used to start /hurd/proc, so at this point there is + no proc server, so we need to be careful here. */ + if (boot->portarray[INIT_PORT_PROC] != MACH_PORT_NULL) + e.error = proc_set_code (boot->portarray[INIT_PORT_PROC], + e.start_code, e.end_code); + if (e.error) + goto out; + /* Create the initial thread. */ e.error = thread_create (newtask, &thread); if (e.error) diff --git a/exec/priv.h b/exec/priv.h index dbecb7a..61c0e72 100644 --- a/exec/priv.h +++ b/exec/priv.h @@ -88,6 +88,10 @@ struct execdata vm_address_t entry; file_t file; + /* Set by load_section. */ + vm_address_t start_code; + vm_address_t end_code; + #ifndef EXECDATA_STREAM /* Note that if `file_data' (below) is set, then these just point -- 1.7.10.4