about summary refs log tree commit diff
path: root/sysdeps/mach
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2021-12-28 10:27:06 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2021-12-28 10:28:22 +0100
commitae49f218daca0b7cab27764da4081e6509bc7345 (patch)
treefef5fa1b87b9bc540c84690c3128c252651f6f34 /sysdeps/mach
parent2ce0481d26066b7d4e2c950da555a7ca20e313fb (diff)
downloadglibc-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 'sysdeps/mach')
-rw-r--r--sysdeps/mach/hurd/brk.c8
-rw-r--r--sysdeps/mach/hurd/check_fds.c6
-rw-r--r--sysdeps/mach/hurd/i386/init-first.c2
3 files changed, 7 insertions, 9 deletions
diff --git a/sysdeps/mach/hurd/brk.c b/sysdeps/mach/hurd/brk.c
index a4294b9eae..088c99b2c8 100644
--- a/sysdeps/mach/hurd/brk.c
+++ b/sysdeps/mach/hurd/brk.c
@@ -21,6 +21,8 @@
 #include <lock-intern.h>	/* For `struct mutex'.  */
 #include <vm_param.h>
 
+#include "set-hooks.h"
+
 
 /* Initial maximum size of the data segment (this is arbitrary).  */
 #define	DATA_SIZE	(128 * 1024 * 1024)
@@ -130,7 +132,7 @@ _hurd_set_brk (vm_address_t addr)
   return 0;
 }
 
-static void
+static void attribute_used_retain
 init_brk (void)
 {
   vm_address_t pagend;
@@ -160,7 +162,5 @@ init_brk (void)
 	/* Couldn't allocate the memory.  The break will be very short.  */
 	_hurd_data_end = pagend;
     }
-
-  (void) &init_brk;		/* Avoid ``defined but not used'' warning.  */
 }
-text_set_element (_hurd_preinit_hook, init_brk);
+SET_RELHOOK (_hurd_preinit_hook, init_brk);
diff --git a/sysdeps/mach/hurd/check_fds.c b/sysdeps/mach/hurd/check_fds.c
index 155e9dd3e9..61e6055d35 100644
--- a/sysdeps/mach/hurd/check_fds.c
+++ b/sysdeps/mach/hurd/check_fds.c
@@ -79,7 +79,7 @@ check_standard_fds (void)
   check_one_fd (STDERR_FILENO, O_RDWR);
 }
 
-static void
+static void attribute_used_retain
 init_standard_fds (void)
 {
   /* Now that we have FDs, make sure that, if this is a SUID program,
@@ -87,10 +87,8 @@ init_standard_fds (void)
      ourselves.  If that's not possible we stop the program.  */
   if (__builtin_expect (__libc_enable_secure, 0))
     check_standard_fds ();
-
-  (void) &init_standard_fds;	/* Avoid "defined but not used" warning.  */
 }
-text_set_element (_hurd_fd_subinit, init_standard_fds);
+SET_RELHOOK (_hurd_fd_subinit, init_standard_fds);
 
 
 #ifndef SHARED
diff --git a/sysdeps/mach/hurd/i386/init-first.c b/sysdeps/mach/hurd/i386/init-first.c
index 5e85aa2bc5..c6ae370daf 100644
--- a/sysdeps/mach/hurd/i386/init-first.c
+++ b/sysdeps/mach/hurd/i386/init-first.c
@@ -242,7 +242,7 @@ first_init (void)
   /* Initialize data structures so we can do RPCs.  */
   __mach_init ();
 
-  RUN_HOOK (_hurd_preinit_hook, ());
+  RUN_RELHOOK (_hurd_preinit_hook, ());
 }
 
 #ifdef SHARED