mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 12:30:06 +00:00
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.
This commit is contained in:
parent
9cec82de71
commit
1ccbb9258e
@ -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>
|
||||
|
||||
|
@ -1,6 +1,8 @@
|
||||
#ifndef _HURD_H
|
||||
#include_next <hurd.h>
|
||||
|
||||
void _hurd_libc_proc_init (char **argv);
|
||||
|
||||
/* Like __USEPORT, but cleans fd on cancel. */
|
||||
#define __USEPORT_CANCEL(which, expr) \
|
||||
HURD_PORT_USE_CANCEL (&_hurd_ports[INIT_PORT_##which], (expr))
|
||||
@ -8,5 +10,6 @@
|
||||
#ifndef _ISOMAC
|
||||
libc_hidden_proto (_hurd_exec_paths)
|
||||
libc_hidden_proto (_hurd_init)
|
||||
libc_hidden_proto (_hurd_libc_proc_init)
|
||||
#endif
|
||||
#endif
|
||||
|
@ -63,6 +63,9 @@ posixland_init (int argc, char **argv, char **envp)
|
||||
{
|
||||
/* Set the FPU control word to the proper default value. */
|
||||
__setfpucw (__fpu_control);
|
||||
|
||||
/* Now we have relocations etc. we can start signals etc. */
|
||||
_hurd_libc_proc_init (argv);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user