summaryrefslogtreecommitdiff
path: root/exec
diff options
context:
space:
mode:
Diffstat (limited to 'exec')
-rw-r--r--exec/priv.h78
1 files changed, 78 insertions, 0 deletions
diff --git a/exec/priv.h b/exec/priv.h
index becb95aa..7b00d9a8 100644
--- a/exec/priv.h
+++ b/exec/priv.h
@@ -19,8 +19,13 @@ along with the GNU Hurd; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
#include <hurd/trivfs.h>
#include <hurd/ports.h>
+#include <hurd/lookup.h>
+#include <rwlock.h>
#include <bfd.h>
#include <elf.h>
#include <fcntl.h>
@@ -61,4 +66,77 @@ typedef struct trivfs_protid *trivfs_protid_t; /* For MiG. */
extern mach_port_t procserver; /* Our proc port. */
+
+/* Data shared between check, check_section,
+ load, load_section, and finish. */
+struct execdata
+ {
+ /* Passed out to caller. */
+ error_t error;
+
+ /* Set by check. */
+ vm_address_t entry;
+ FILE stream;
+ file_t file;
+
+#ifdef BFD
+ bfd *bfd;
+#endif
+ union /* Interpreter section giving name of file. */
+ {
+ asection *section;
+ const Elf32_Phdr *phdr;
+ } interp;
+ memory_object_t filemap, cntlmap;
+ struct shared_io *cntl;
+ char *file_data; /* File data if already copied in core. */
+ off_t file_size;
+ size_t optimal_block; /* Optimal size for io_read from file. */
+
+ /* Set by caller of load. */
+ task_t task;
+
+ union
+ {
+ /* Vector indexed by section index,
+ information passed from check_section to load_section.
+ Set by caller of check_section and load. */
+ vm_offset_t *bfd_locations;
+ struct
+ {
+ /* Program header table read from the executable.
+ After `check' this is a pointer into the mapping window.
+ By `load' it is local alloca'd storage. */
+ Elf32_Phdr *phdr;
+ Elf32_Word phnum; /* Number of program header table elements. */
+ int anywhere; /* Nonzero if image can go anywhere. */
+ vm_address_t loadbase; /* Actual mapping location. */
+ } elf;
+ } info;
+ };
+
+void finish (struct execdata *, int dealloc_file_port);
+
+void check_hashbang (struct execdata *e,
+ file_t file,
+ task_t oldtask,
+ int flags,
+ char *argv, u_int argvlen, boolean_t argv_copy,
+ char *envp, u_int envplen, boolean_t envp_copy,
+ mach_port_t *dtable, u_int dtablesize,
+ boolean_t dtable_copy,
+ mach_port_t *portarray, u_int nports,
+ boolean_t portarray_copy,
+ int *intarray, u_int nints, boolean_t intarray_copy,
+ mach_port_t *deallocnames, u_int ndeallocnames,
+ mach_port_t *destroynames, u_int ndestroynames);
+
+
+/* Standard exec data for secure execs. */
+extern mach_port_t *std_ports;
+extern int *std_ints;
+extern size_t std_nports, std_nints;
+extern struct rwlock std_lock;
+
+
#endif /* exec_priv_h */