about summary refs log tree commit diff
path: root/hurd/hurdinit.c
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2020-11-11 12:52:35 +0000
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2020-11-11 20:41:25 +0000
commit1ccbb9258eed0f667edf459a28ba23a805549b36 (patch)
treead130ed6b0e7a1a1c5ee5ee87f27ed88264abf44 /hurd/hurdinit.c
parent9cec82de715b3ffc625a6c67d107a3fcb26af566 (diff)
downloadglibc-1ccbb9258eed0f667edf459a28ba23a805549b36.tar.gz
glibc-1ccbb9258eed0f667edf459a28ba23a805549b36.tar.xz
glibc-1ccbb9258eed0f667edf459a28ba23a805549b36.zip
hurd: Notify the proc server later during initialization
Notifying the proc server is an involved task, and unleashes various signal
handling etc. so we have to do this after e.g. ifunc relocations are
completed.
Diffstat (limited to 'hurd/hurdinit.c')
-rw-r--r--hurd/hurdinit.c36
1 files changed, 25 insertions, 11 deletions
diff --git a/hurd/hurdinit.c b/hurd/hurdinit.c
index a884b78de6..e4ec005b48 100644
--- a/hurd/hurdinit.c
+++ b/hurd/hurdinit.c
@@ -34,6 +34,10 @@ sigset_t _hurdsig_traced;
 char **__libc_argv;
 int __libc_argc;
 
+static int *_hurd_intarray;
+static size_t _hurd_intarraysize;
+static mach_port_t *_hurd_portarray;
+static size_t _hurd_portarraysize;
 
 error_t
 _hurd_ports_use (int which, error_t (*operate) (mach_port_t))
@@ -87,17 +91,10 @@ _hurd_init (int flags, char **argv,
   if (intarraysize > INIT_TRACEMASK)
     _hurdsig_traced = intarray[INIT_TRACEMASK];
 
-  /* Tell the proc server we exist, if it does.  */
-  if (portarray[INIT_PORT_PROC] != MACH_PORT_NULL)
-    _hurd_new_proc_init (argv, intarray, intarraysize);
-
-  /* All done with init ints and ports.  */
-  __vm_deallocate (__mach_task_self (),
-		   (vm_address_t) intarray,
-		   intarraysize * sizeof (int));
-  __vm_deallocate (__mach_task_self (),
-		   (vm_address_t) portarray,
-		   portarraysize * sizeof (mach_port_t));
+  _hurd_intarray = intarray;
+  _hurd_intarraysize = intarraysize;
+  _hurd_portarray = portarray;
+  _hurd_portarraysize = portarraysize;
 
   if (flags & EXEC_SECURE)
     {
@@ -113,6 +110,23 @@ _hurd_init (int flags, char **argv,
   RUN_HOOK (_hurd_subinit, ());
 }
 libc_hidden_def (_hurd_init)
+
+void
+_hurd_libc_proc_init (char **argv)
+{
+  /* Tell the proc server we exist, if it does.  */
+  if (_hurd_portarray[INIT_PORT_PROC] != MACH_PORT_NULL)
+    _hurd_new_proc_init (argv, _hurd_intarray, _hurd_intarraysize);
+
+  /* All done with init ints and ports.  */
+  __vm_deallocate (__mach_task_self (),
+		   (vm_address_t) _hurd_intarray,
+		   _hurd_intarraysize * sizeof (int));
+  __vm_deallocate (__mach_task_self (),
+		   (vm_address_t) _hurd_portarray,
+		   _hurd_portarraysize * sizeof (mach_port_t));
+}
+libc_hidden_def (_hurd_libc_proc_init)
 
 #include <hurd/signal.h>