summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2012-05-10 14:51:22 -0700
committerRoland McGrath <roland@hack.frob.com>2012-05-10 15:57:24 -0700
commit5d5722e8ac22253bdc819da2d676d9900da0c533 (patch)
tree5da1821658c8038709f264e4d6b7e096e80bb7eb
parentbe971a2b1c7828d94c41edd5cd22c1d9dcef1b6e (diff)
downloadglibc-5d5722e8ac22253bdc819da2d676d9900da0c533.tar.gz
Hurd: Fix value of __libc_stack_end
-rw-r--r--ChangeLog10
-rw-r--r--sysdeps/generic/ldsodefs.h6
-rw-r--r--sysdeps/mach/hurd/dl-sysdep.h5
-rw-r--r--sysdeps/mach/hurd/i386/init-first.c2
4 files changed, 20 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index fea15ee5dd..1ae3593ae9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2012-05-10 Samuel Thibault <samuel.thibault@ens-lyon.org>
+
+ * sysdeps/generic/ldsodefs.h [LIBC_STACK_END_NOT_RELRO]
+ (__libc_stack_end): Do not use attribute_relro.
+ * sysdeps/mach/hurd/dl-sysdep.h (LIBC_STACK_END_NOT_RELRO): Define.
+ * sysdeps/mach/hurd/i386/init-first.c (init): Update __libc_stack_end
+ to libthread-provided value.
+ * sysdeps/mach/hurd/dl-sysdep.c (__libc_stack_end): Do not use
+ attribute_relro.
+
2012-05-10 Thomas Schwinge <thomas@schwinge.name>
[BZ #3748]
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index 602b429cea..e071015cee 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -717,7 +717,11 @@ rtld_hidden_proto (_dl_make_stack_executable)
might use the variable which results in copy relocations on some
platforms. But this does not matter, ld.so can always use the local
copy. */
-extern void *__libc_stack_end attribute_relro;
+extern void *__libc_stack_end
+#ifndef LIBC_STACK_END_NOT_RELRO
+ attribute_relro
+#endif
+ ;
rtld_hidden_proto (__libc_stack_end)
/* Parameters passed to the dynamic linker. */
diff --git a/sysdeps/mach/hurd/dl-sysdep.h b/sysdeps/mach/hurd/dl-sysdep.h
index 671b241839..c64a39d924 100644
--- a/sysdeps/mach/hurd/dl-sysdep.h
+++ b/sysdeps/mach/hurd/dl-sysdep.h
@@ -1,5 +1,5 @@
/* System-specific settings for dynamic linker code. Hurd version.
- Copyright (C) 2002, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -24,7 +24,8 @@
#define RTLD_PRIVATE_ERRNO 0
#ifdef SHARED
-/* _dl_argv cannot be attribute_relro, because the stack-switching
+/* _dl_argv and __libc_stack_end cannot be attribute_relro, because the stack-switching
libc initializer for using cthreads might write into it. */
# define DL_ARGV_NOT_RELRO 1
+# define LIBC_STACK_END_NOT_RELRO 1
#endif
diff --git a/sysdeps/mach/hurd/i386/init-first.c b/sysdeps/mach/hurd/i386/init-first.c
index f4bf624680..fa4e3d9f6e 100644
--- a/sysdeps/mach/hurd/i386/init-first.c
+++ b/sysdeps/mach/hurd/i386/init-first.c
@@ -214,6 +214,8 @@ init (int *data)
void switch_stacks (void);
+ __libc_stack_end = newsp;
+
/* Copy per-thread variables from that temporary
area onto the new cthread stack. */
memcpy (__hurd_threadvar_location_from_sp (0, newsp),