aboutsummaryrefslogtreecommitdiff
path: root/elf/rtld.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-01-15 06:38:27 +0000
committerUlrich Drepper <drepper@redhat.com>2004-01-15 06:38:27 +0000
commit392a6b52656c1bb40305375b0ea9020455044f9d (patch)
tree7f1b5fa05ad490bae7df8b3947d6f59f98aa082a /elf/rtld.c
parentcb6ee14a12384563853788c938a86c5354fdea2d (diff)
downloadglibc-392a6b52656c1bb40305375b0ea9020455044f9d.zip
glibc-392a6b52656c1bb40305375b0ea9020455044f9d.tar.gz
glibc-392a6b52656c1bb40305375b0ea9020455044f9d.tar.bz2
Update.
2004-01-14 Ulrich Drepper <drepper@redhat.com> * configure.in: Define HAVE_Z_RELRO if the linker supports -z relro. * config.h.in: Add entry for HAVE_Z_RELRO. * include/libc-symbols.h: Define attribute_relro. * elf/dl-load.c: Add attribute_relro to env_path_list, capstr, ncapstr, max_capstrlen, and max_dirnamelen definitions. * elf/rtld.c: Add attribute_relro to _dl_argc, _dl_argv, _dl_skip_args, load_time, start_time, library_path, preloadlist, version_info, any_debug. Remove rtld_total_time. Make it a local variable. Pass pointer to it to print_statistics. Change print_statistics accordingly. * sysdeps/generic/dl-sysdep.c: Add attribute_relro to _dl_auxv. Use attribute_relro instead of explicitly assigning variable to the .data.rel.ro section for __libc_enable_secure and __libc_stack_end. * sysdeps/generic/ldsodefs.h: Declare __libc_stack_end, _dl_argc, _dl_argv, _dl_argv_internal with attribute_relro.
Diffstat (limited to 'elf/rtld.c')
-rw-r--r--elf/rtld.c42
1 files changed, 21 insertions, 21 deletions
diff --git a/elf/rtld.c b/elf/rtld.c
index 91723cc..62e0dd5 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -57,7 +57,7 @@ static void print_missing_version (int errcode, const char *objname,
const char *errsting);
/* Print the various times we collected. */
-static void print_statistics (void);
+static void print_statistics (hp_timing_t *total_timep);
/* This is a list of all the modes the dynamic loader can be in. */
enum mode { normal, list, verify, trace };
@@ -67,12 +67,12 @@ enum mode { normal, list, verify, trace };
all the entries. */
static void process_envvars (enum mode *modep);
-int _dl_argc attribute_hidden;
-char **_dl_argv = NULL;
+int _dl_argc attribute_relro attribute_hidden;
+char **_dl_argv attribute_relro;
INTDEF(_dl_argv)
/* Nonzero if we were run directly. */
-unsigned int _dl_skip_args attribute_hidden;
+unsigned int _dl_skip_args attribute_relro attribute_hidden;
/* Set nonzero during loading and initialization of executable and
libraries, cleared before the executable's entry point runs. This
@@ -115,6 +115,7 @@ extern struct rtld_global _rtld_local
static void dl_main (const ElfW(Phdr) *phdr, ElfW(Word) phnum,
ElfW(Addr) *user_entry);
+/* These two variables cannot be moved into .data.rel.ro. */
static struct libname_list _dl_rtld_libname;
static struct libname_list _dl_rtld_libname2;
@@ -126,10 +127,9 @@ static struct libname_list _dl_rtld_libname2;
/* Variable for statistics. */
#ifndef HP_TIMING_NONAVAIL
-static hp_timing_t rtld_total_time;
static hp_timing_t relocate_time;
-static hp_timing_t load_time;
-static hp_timing_t start_time;
+static hp_timing_t load_time attribute_relro;
+static hp_timing_t start_time attribute_relro;
#endif
/* Additional definitions needed by TLS initialization. */
@@ -263,6 +263,7 @@ _dl_start_final (void *arg, struct dl_start_final_info *info)
start_addr = _dl_sysdep_start (arg, &dl_main);
#ifndef HP_TIMING_NONAVAIL
+ hp_timing_t rtld_total_time;
if (HP_TIMING_AVAIL)
{
hp_timing_t end_time;
@@ -276,7 +277,7 @@ _dl_start_final (void *arg, struct dl_start_final_info *info)
#endif
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_STATISTICS, 0))
- print_statistics ();
+ print_statistics (&rtld_total_time);
return start_addr;
}
@@ -619,10 +620,12 @@ static void rtld_lock_default_unlock_recursive (void *lock)
#endif
-static const char *library_path; /* The library search path. */
-static const char *preloadlist; /* The list preloaded objects. */
-static int version_info; /* Nonzero if information about
- versions has to be printed. */
+/* The library search path. */
+static const char *library_path attribute_relro;
+/* The list preloaded objects. */
+static const char *preloadlist attribute_relro;
+/* Nonzero if information about versions has to be printed. */
+static int version_info attribute_relro;
static void
dl_main (const ElfW(Phdr) *phdr,
@@ -1815,7 +1818,7 @@ print_missing_version (int errcode __attribute__ ((unused)),
}
/* Nonzero if any of the debugging options is enabled. */
-static int any_debug;
+static int any_debug attribute_relro;
/* Process the string given as the parameter which explains which debugging
options are enabled. */
@@ -2127,7 +2130,7 @@ process_envvars (enum mode *modep)
/* Print the various times we collected. */
static void
-print_statistics (void)
+print_statistics (hp_timing_t *rtld_total_timep)
{
#ifndef HP_TIMING_NONAVAIL
char buf[200];
@@ -2137,18 +2140,15 @@ print_statistics (void)
/* Total time rtld used. */
if (HP_TIMING_AVAIL)
{
- HP_TIMING_PRINT (buf, sizeof (buf), rtld_total_time);
+ HP_TIMING_PRINT (buf, sizeof (buf), *rtld_total_timep);
INTUSE(_dl_debug_printf) ("\nruntime linker statistics:\n"
" total startup time in dynamic loader: %s\n",
buf);
- }
- /* Print relocation statistics. */
- if (HP_TIMING_AVAIL)
- {
+ /* Print relocation statistics. */
char pbuf[30];
HP_TIMING_PRINT (buf, sizeof (buf), relocate_time);
- cp = _itoa ((1000ULL * relocate_time) / rtld_total_time,
+ cp = _itoa ((1000ULL * relocate_time) / *rtld_total_timep,
pbuf + sizeof (pbuf), 10, 0);
wp = pbuf;
switch (pbuf + sizeof (pbuf) - cp)
@@ -2198,7 +2198,7 @@ print_statistics (void)
{
char pbuf[30];
HP_TIMING_PRINT (buf, sizeof (buf), load_time);
- cp = _itoa ((1000ULL * load_time) / rtld_total_time,
+ cp = _itoa ((1000ULL * load_time) / *rtld_total_timep,
pbuf + sizeof (pbuf), 10, 0);
wp = pbuf;
switch (pbuf + sizeof (pbuf) - cp)