diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2021-12-28 10:27:06 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2021-12-28 10:28:22 +0100 |
commit | ae49f218daca0b7cab27764da4081e6509bc7345 (patch) | |
tree | fef5fa1b87b9bc540c84690c3128c252651f6f34 /hurd | |
parent | 2ce0481d26066b7d4e2c950da555a7ca20e313fb (diff) | |
download | glibc-ae49f218daca0b7cab27764da4081e6509bc7345.tar.gz glibc-ae49f218daca0b7cab27764da4081e6509bc7345.tar.xz glibc-ae49f218daca0b7cab27764da4081e6509bc7345.zip |
hurd: Fix static-PIE startup
hurd initialization stages use RUN_HOOK to run various initialization functions. That is however using absolute addresses which need to be relocated, which is done later by csu. We can however easily make the linker compute relative addresses which thus don't need a relocation. The new SET_RELHOOK and RUN_RELHOOK macros implement this.
Diffstat (limited to 'hurd')
-rw-r--r-- | hurd/dtable.c | 8 | ||||
-rw-r--r-- | hurd/hurdid.c | 7 | ||||
-rw-r--r-- | hurd/hurdinit.c | 6 | ||||
-rw-r--r-- | hurd/hurdmalloc.c | 10 | ||||
-rw-r--r-- | hurd/hurdpid.c | 7 | ||||
-rw-r--r-- | hurd/hurdrlimit.c | 7 | ||||
-rw-r--r-- | hurd/hurdsock.c | 7 |
7 files changed, 21 insertions, 31 deletions
diff --git a/hurd/dtable.c b/hurd/dtable.c index bbd3bfc892..4f081f09fd 100644 --- a/hurd/dtable.c +++ b/hurd/dtable.c @@ -36,7 +36,7 @@ DEFINE_HOOK (_hurd_fd_subinit, (void)); /* Initialize the file descriptor table at startup. */ -static void +static void attribute_used_retain init_dtable (void) { int i; @@ -91,12 +91,10 @@ init_dtable (void) /* Run things that want to run after the file descriptor table is initialized. */ - RUN_HOOK (_hurd_fd_subinit, ()); - - (void) &init_dtable; /* Avoid "defined but not used" warning. */ + RUN_RELHOOK (_hurd_fd_subinit, ()); } -text_set_element (_hurd_subinit, init_dtable); +SET_RELHOOK (_hurd_subinit, init_dtable); /* XXX when the linker supports it, the following functions should all be elsewhere and just have text_set_elements here. */ diff --git a/hurd/hurdid.c b/hurd/hurdid.c index 70c46c0740..b220532c35 100644 --- a/hurd/hurdid.c +++ b/hurd/hurdid.c @@ -17,6 +17,7 @@ #include <hurd.h> #include <hurd/id.h> +#include "set-hooks.h" struct hurd_id_data _hurd_id; @@ -74,7 +75,7 @@ _hurd_check_ids (void) return 0; } -static void +static void attribute_used_retain init_id (void) { __mutex_init (&_hurd_id.lock); @@ -84,7 +85,5 @@ init_id (void) _hurd_id.gen.nuids = _hurd_id.aux.nuids = 0; _hurd_id.gen.gids = _hurd_id.aux.gids = NULL; _hurd_id.gen.ngids = _hurd_id.aux.ngids = 0; - - (void) &init_id; /* Avoid "defined but not used" warning. */ } -text_set_element (_hurd_preinit_hook, init_id); +SET_RELHOOK (_hurd_preinit_hook, init_id); diff --git a/hurd/hurdinit.c b/hurd/hurdinit.c index d4d219a083..9377d902d2 100644 --- a/hurd/hurdinit.c +++ b/hurd/hurdinit.c @@ -108,7 +108,7 @@ _hurd_init (int flags, char **argv, /* Call other things which want to do some initialization. These are not on the __libc_subinit hook because things there like to be able to assume the availability of the POSIX.1 services we provide. */ - RUN_HOOK (_hurd_subinit, ()); + RUN_RELHOOK (_hurd_subinit, ()); } libc_hidden_def (_hurd_init) @@ -190,7 +190,7 @@ _hurd_new_proc_init (char **argv, /* Call other things which want to do some initialization. These are not on the _hurd_subinit hook because things there assume that things done here, like _hurd_pid, are already initialized. */ - RUN_HOOK (_hurd_proc_subinit, ()); + RUN_RELHOOK (_hurd_proc_subinit, ()); /* XXX This code should probably be removed entirely at some point. This conditional should make it reasonably usable with old gdb's for a @@ -242,7 +242,7 @@ _hurd_setproc (process_t procserver) /* Call these functions again so they can fetch the new information from the new proc server. */ - RUN_HOOK (_hurd_proc_subinit, ()); + RUN_RELHOOK (_hurd_proc_subinit, ()); if (_hurd_pgrp != oldpgrp) { diff --git a/hurd/hurdmalloc.c b/hurd/hurdmalloc.c index 7046bcef33..ccb8fc8b54 100644 --- a/hurd/hurdmalloc.c +++ b/hurd/hurdmalloc.c @@ -1,5 +1,6 @@ #include <stdlib.h> #include <string.h> +#include "set-hooks.h" #include "hurdmalloc.h" /* XXX see that file */ @@ -148,7 +149,7 @@ static struct free_list malloc_free_list[NBUCKETS]; It preserves the values of data variables like malloc_free_list, but does not save the vm_allocate'd space allocated by this malloc. */ -static void +static void attribute_used_retain malloc_init (void) { int i; @@ -160,11 +161,6 @@ malloc_init (void) malloc_free_list[i].in_use = 0; #endif } - - /* This not only suppresses a `defined but not used' warning, - but it is ABSOLUTELY NECESSARY to avoid the hyperclever - compiler from "optimizing out" the entire function! */ - (void) &malloc_init; } static void @@ -445,4 +441,4 @@ _hurd_malloc_fork_child(void) } -text_set_element (_hurd_preinit_hook, malloc_init); +SET_RELHOOK (_hurd_preinit_hook, malloc_init); diff --git a/hurd/hurdpid.c b/hurd/hurdpid.c index 9014de58e9..613ca357c6 100644 --- a/hurd/hurdpid.c +++ b/hurd/hurdpid.c @@ -17,11 +17,12 @@ #include <hurd.h> #include <lowlevellock.h> +#include "set-hooks.h" pid_t _hurd_pid, _hurd_ppid, _hurd_pgrp; int _hurd_orphaned; -static void +static void attribute_used_retain init_pids (void) { __USEPORT (PROC, @@ -29,11 +30,9 @@ init_pids (void) __proc_getpids (port, &_hurd_pid, &_hurd_ppid, &_hurd_orphaned); __proc_getpgrp (port, _hurd_pid, &_hurd_pgrp); })); - - (void) &init_pids; /* Avoid "defined but not used" warning. */ } -text_set_element (_hurd_proc_subinit, init_pids); +SET_RELHOOK (_hurd_proc_subinit, init_pids); #include <hurd/msg_server.h> #include "set-hooks.h" diff --git a/hurd/hurdrlimit.c b/hurd/hurdrlimit.c index 17535c2851..4d16bd4f3f 100644 --- a/hurd/hurdrlimit.c +++ b/hurd/hurdrlimit.c @@ -19,6 +19,7 @@ #include <hurd.h> #include <lock-intern.h> #include <hurd/resource.h> +#include "set-hooks.h" /* This must be given an initializer, or the a.out linking rules will not include the entire file when this symbol is referenced. */ @@ -29,7 +30,7 @@ struct rlimit _hurd_rlimits[RLIM_NLIMITS] = { { 0, }, }; mutex_init is still required below just in case of unexec. */ struct mutex _hurd_rlimit_lock = { SPIN_LOCK_INITIALIZER, }; -static void +static void attribute_used_retain init_rlimit (void) { int i; @@ -52,7 +53,5 @@ init_rlimit (void) } #undef I } - - (void) &init_rlimit; } -text_set_element (_hurd_preinit_hook, init_rlimit); +SET_RELHOOK (_hurd_preinit_hook, init_rlimit); diff --git a/hurd/hurdsock.c b/hurd/hurdsock.c index 04e86b4324..116326b2f2 100644 --- a/hurd/hurdsock.c +++ b/hurd/hurdsock.c @@ -25,6 +25,7 @@ #include <_itoa.h> #include <lock-intern.h> /* For `struct mutex'. */ #include "hurdmalloc.h" /* XXX */ +#include "set-hooks.h" static struct mutex lock; @@ -109,7 +110,7 @@ retry: return server; } -static void +static void attribute_used_retain init (void) { int i; @@ -118,7 +119,5 @@ init (void) for (i = 0; i < max_domain; ++i) servers[i] = MACH_PORT_NULL; - - (void) &init; /* Avoid "defined but not used" warning. */ } -text_set_element (_hurd_preinit_hook, init); +SET_RELHOOK (_hurd_preinit_hook, init); |