On Thu, Aug 25, 2011 at 12:22:44AM +0200, Samuel Thibault wrote: > When using some libthread, we need to update the value of __libc_stack_end > to what the libthread allocated. This requires making __libc_stack_end > non-relro to be able to modify it. > > Samuel > > 2011-08-24 Samuel Thibault <samuel.thiba...@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. > > --- > generic/ldsodefs.h | 6 +++++- > mach/hurd/dl-sysdep.c | 2 +- > mach/hurd/dl-sysdep.h | 3 ++- > mach/hurd/i386/init-first.c | 2 ++ > 4 files changed, 10 insertions(+), 3 deletions(-) > > diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h > index d040590..cb24ca7 100644 > --- a/sysdeps/generic/ldsodefs.h > +++ b/sysdeps/generic/ldsodefs.h > @@ -723,7 +723,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 4b21b77..8f1c728 100644 > --- a/sysdeps/mach/hurd/dl-sysdep.h > +++ b/sysdeps/mach/hurd/dl-sysdep.h > @@ -25,7 +25,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 e79af1d..7b2ea12 100644 > --- a/sysdeps/mach/hurd/i386/init-first.c > +++ b/sysdeps/mach/hurd/i386/init-first.c > @@ -227,6 +224,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), > diff --git a/sysdeps/mach/hurd/dl-sysdep.c b/sysdeps/mach/hurd/dl-sysdep.c > index a63151f..a5df5c1 100644 > --- a/sysdeps/mach/hurd/dl-sysdep.c > +++ b/sysdeps/mach/hurd/dl-sysdep.c > @@ -55,7 +55,7 @@ INTVARDEF(__libc_enable_secure) > int __libc_multiple_libcs = 0; /* Defining this here avoids the > inclusion > of init-first. */ > /* This variable containts the lowest stack address ever used. */ > -void *__libc_stack_end attribute_relro = NULL; > +void *__libc_stack_end = NULL; > rtld_hidden_data_def(__libc_stack_end) > void *_dl_random attribute_relro = NULL; /* TODO */ >
This last hunk doesn't apply. The current git code has: | /* This variable containts the lowest stack address ever used. */ | void *__libc_stack_end; -- Aurelien Jarno GPG: 1024D/F1BCDB73 aurel...@aurel32.net http://www.aurel32.net