about summary refs log tree commit diff
path: root/elf
diff options
context:
space:
mode:
Diffstat (limited to 'elf')
-rw-r--r--elf/Versions2
-rw-r--r--elf/dl-open.c9
-rw-r--r--elf/dl-support.c5
-rw-r--r--elf/rtld.c14
4 files changed, 19 insertions, 11 deletions
diff --git a/elf/Versions b/elf/Versions
index e26e096469..8f1981e45a 100644
--- a/elf/Versions
+++ b/elf/Versions
@@ -39,7 +39,7 @@ ld.so {
   }
   GLIBC_2.1.1 {
     # global variables
-    _dl_origin_path; _dl_platformlen;
+    _dl_lazy; _dl_origin_path; _dl_platformlen;
 
     # functions used in other libraries
     _dl_dst_count; _dl_dst_substitute;
diff --git a/elf/dl-open.c b/elf/dl-open.c
index 9a3c0939d8..b6c79b41ef 100644
--- a/elf/dl-open.c
+++ b/elf/dl-open.c
@@ -46,6 +46,8 @@ extern char **__libc_argv;
 
 extern char **__environ;
 
+extern int _dl_lazy;			/* Do we do lazy relocations?  */
+
 /* Undefine the following for debugging.  */
 /* #define SCOPE_DEBUG 1 */
 #ifdef SCOPE_DEBUG
@@ -85,6 +87,7 @@ dl_open_worker (void *a)
   struct r_debug *r;
   unsigned int global_add;
   const char *dst;
+  int lazy;
 
   /* Maybe we have to expand a DST.  */
   dst = strchr (file, '$');
@@ -145,6 +148,9 @@ dl_open_worker (void *a)
   show_scope (new);
 #endif
 
+  /* Only do lazy relocation if `LD_BIND_NOW' is not set.  */
+  lazy = (mode & RTLD_BINDING_MASK) == RTLD_LAZY && _dl_lazy;
+
   /* Relocate the objects loaded.  We do this in reverse order so that copy
      relocs of earlier objects overwrite the data written by later objects.  */
 
@@ -173,8 +179,7 @@ dl_open_worker (void *a)
 	    }
 	  else
 #endif
-	    _dl_relocate_object (l, l->l_scope,
-				 (mode & RTLD_BINDING_MASK) == RTLD_LAZY, 0);
+	    _dl_relocate_object (l, l->l_scope, lazy, 0);
 	}
 
       if (l == new)
diff --git a/elf/dl-support.c b/elf/dl-support.c
index 450c9c90df..b3ff0c6857 100644
--- a/elf/dl-support.c
+++ b/elf/dl-support.c
@@ -1,5 +1,5 @@
 /* Support for dynamic linking code in static libc.
-   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 1998, 1999 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
@@ -40,6 +40,7 @@ int _dl_debug_symbols;
 int _dl_debug_versions;
 int _dl_debug_reloc;
 int _dl_debug_files;
+int _dl_lazy;
 
 /* If nonzero print warnings about problematic situations.  */
 int _dl_verbose;
@@ -90,6 +91,8 @@ non_dynamic_init (void)
      objects.  */
   _dl_init_paths (getenv ("LD_LIBRARY_PATH"));
 
+  _dl_lazy = *(getenv ("LD_BIND_NOW") ?: "") == '\0';
+
 #ifdef DL_PLATFORM_INIT
   DL_PLATFORM_INIT;
 #endif
diff --git a/elf/rtld.c b/elf/rtld.c
index acbe3cdcbd..064cd20dd3 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -82,6 +82,7 @@ struct r_search_path *_dl_search_paths;
 const char *_dl_profile;
 const char *_dl_profile_output;
 struct link_map *_dl_profile_map;
+int _dl_lazy;
 int _dl_debug_libs;
 int _dl_debug_impcalls;
 int _dl_debug_bindings;
@@ -332,7 +333,6 @@ dl_main (const ElfW(Phdr) *phdr,
 	 ElfW(Addr) *user_entry)
 {
   const ElfW(Phdr) *ph;
-  int lazy;
   enum mode mode;
   struct link_map **preloads;
   unsigned int npreloads;
@@ -346,7 +346,7 @@ dl_main (const ElfW(Phdr) *phdr,
   hp_timing_t diff;
 
   /* Process the environment variable which control the behaviour.  */
-  process_envvars (&mode, &lazy);
+  process_envvars (&mode, &_dl_lazy);
 
   /* Set up a flag which tells we are just starting.  */
   _dl_starting_up = 1;
@@ -377,7 +377,7 @@ dl_main (const ElfW(Phdr) *phdr,
 	if (! strcmp (_dl_argv[1], "--list"))
 	  {
 	    mode = list;
-	    lazy = -1;	/* This means do no dependency analysis.  */
+	    _dl_lazy = -1;	/* This means do no dependency analysis.  */
 
 	    ++_dl_skip_args;
 	    --_dl_argc;
@@ -853,13 +853,13 @@ of this helper program; chances are you did not intend to run this program.\n\
 	  }
       else
 	{
-	  if (lazy >= 0)
+	  if (_dl_lazy >= 0)
 	    {
 	      /* We have to do symbol dependency testing.  */
 	      struct relocate_args args;
 	      struct link_map *l;
 
-	      args.lazy = lazy;
+	      args.lazy = _dl_lazy;
 
 	      l = _dl_loaded;
 	      while (l->l_next)
@@ -974,7 +974,7 @@ of this helper program; chances are you did not intend to run this program.\n\
     hp_timing_t add;
 
     /* If we are profiling we also must do lazy reloaction.  */
-    lazy |= consider_profiling;
+    _dl_lazy |= consider_profiling;
 
     l = _dl_loaded;
     while (l->l_next)
@@ -984,7 +984,7 @@ of this helper program; chances are you did not intend to run this program.\n\
     do
       {
 	if (l != &_dl_rtld_map)
-	  _dl_relocate_object (l, l->l_scope, lazy, consider_profiling);
+	  _dl_relocate_object (l, l->l_scope, _dl_lazy, consider_profiling);
 
 	l = l->l_prev;
       }