[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[PATCH 16/17] exec: keep track of the range where executable segments are mapped



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


Reply to: