aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog16
-rw-r--r--elf/rtld.c3
-rw-r--r--sysdeps/generic/dl-sysdep.c5
-rw-r--r--sysdeps/generic/ldsodefs.h8
-rw-r--r--sysdeps/generic/libc-start.c7
5 files changed, 34 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 0d7fe80..3d9fd96 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,9 +1,25 @@
+2004-01-13 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/x86_64/dl-machine.h: Include <tls.h>.
+
+ * elf/rtld.c (_dl_start_final): Initialze __libc_stack_end here.
+ * sysdeps/generic/dl-sysdep.c: Define __libc_stack_end with
+ rtld_hidden_def and move into .data.rel.ro section.
+ * sysdeps/generic/ldsodefs.h: Declare __libc_stack_end with
+ rtld_hidden_proto.
+ * sysdeps/generic/libc-start.c: Only initialize __libc_stack_end here
+ if !SHARED.
+
2004-01-13 Richard Henderson <rth@redhat.com>
* sysdeps/unix/sysv/linux/alpha/rt_sigaction.S: Fix typo.
2004-01-13 Ulrich Drepper <drepper@redhat.com>
+ * sysdeps/unix/sysv/linux/dl-execstack.c
+ (_dl_make_stack_executable): Move common code in front. Use
+ __builtin_expect.
+
* sysdeps/unix/sysv/linux/dl-execstack.c: Change interface. Add
challenge for caller.
* sysdeps/generic/ldsodefs.h: Change declaration and type of hook
diff --git a/elf/rtld.c b/elf/rtld.c
index 4273a6f..91723cc 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -253,6 +253,9 @@ _dl_start_final (void *arg, struct dl_start_final_info *info)
HP_TIMING_NOW (GL(dl_cpuclock_offset));
#endif
+ /* Initialize the stack end variable. */
+ __libc_stack_end = __builtin_frame_address (0);
+
/* Call the OS-dependent function to set up life so we can do things like
file access. It will call `dl_main' (below) to do all the real work
of the dynamic linker, and then unwind our frame and run the user
diff --git a/sysdeps/generic/dl-sysdep.c b/sysdeps/generic/dl-sysdep.c
index 53b9ea2..5ec0633 100644
--- a/sysdeps/generic/dl-sysdep.c
+++ b/sysdeps/generic/dl-sysdep.c
@@ -1,5 +1,5 @@
/* Operating system support for run-time dynamic linker. Generic Unix version.
- Copyright (C) 1995-1998, 2000-2002, 2003 Free Software Foundation, Inc.
+ Copyright (C) 1995-1998, 2000-2003, 2004 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
@@ -53,7 +53,8 @@ INTVARDEF(__libc_enable_secure)
int __libc_multiple_libcs = 0; /* Defining this here avoids the inclusion
of init-first. */
/* This variable contains the lowest stack address ever used. */
-void *__libc_stack_end;
+void *__libc_stack_end __attribute__ ((section (".data.rel.ro")));
+rtld_hidden_def(__libc_stack_end)
static ElfW(auxv_t) *_dl_auxv;
#ifndef DL_FIND_ARG_COMPONENTS
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index 852cf51..f511c5d 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -456,6 +456,14 @@ extern void **_dl_initial_error_catch_tsd (void) __attribute__ ((const))
extern int _dl_make_stack_executable (void **stack_endp) internal_function;
rtld_hidden_proto (_dl_make_stack_executable)
+/* Variable pointing to the end of the stack (or close to it). This value
+ must be constant over the runtime of the application. Some programs
+ 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;
+rtld_hidden_proto (__libc_stack_end)
+
/* Parameters passed to the dynamic linker. */
extern int _dl_argc attribute_hidden;
extern char **_dl_argv;
diff --git a/sysdeps/generic/libc-start.c b/sysdeps/generic/libc-start.c
index e297b0a..716bbc7 100644
--- a/sysdeps/generic/libc-start.c
+++ b/sysdeps/generic/libc-start.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998,1999,2000,2001,2002,2003 Free Software Foundation, Inc.
+/* Copyright (C) 1998-2003, 2004 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
@@ -105,10 +105,11 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
INIT_ARGV_and_ENVIRON;
- /* Store the lowest stack address. */
+#ifndef SHARED
+ /* Store the lowest stack address. This is done in ld.so if this is
+ the code for the DSO. */
__libc_stack_end = stack_end;
-#ifndef SHARED
# ifdef HAVE_AUX_VECTOR
/* First process the auxiliary vector since we need to find the
program header to locate an eventually present PT_TLS entry. */