about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--elf/dl-load.c5
-rw-r--r--elf/rtld.c45
3 files changed, 46 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index ad0b113e31..9ee23572ec 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+1998-03-08  Ulrich Drepper  <drepper@cygnus.com>
+
+	* elf/rtld.c (process_envvars): Also recognize LD_LIBRARY_PATH,
+	LD_PRELOAD, and LD_VERBOSE.
+	(dl_main): Use global variables set by process_envvars instead of
+	calling getenv.
+	* elf/dl-load.c (_dl_init_paths): Don't call getenv to get
+	LD_LIBRARY_PATH value, this comes with the parameter.
+
 1998-03-08 22:55  Ulrich Drepper  <drepper@cygnus.com>
 
 	* elf/rtld.c (dl_main): Delay initialization of path structure if
diff --git a/elf/dl-load.c b/elf/dl-load.c
index f91a7ae4d3..1d700f9da4 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -333,11 +333,6 @@ _dl_init_paths (const char *llp)
   /* Number of elements in the library path.  */
   size_t nllp;
 
-  /* If the user has not specified a library path consider the environment
-     variable.  */
-  if (llp == NULL)
-    llp = getenv ("LD_LIBRARY_PATH");
-
   /* First determine how many elements the LD_LIBRARY_PATH contents has.  */
   if (llp != NULL && *llp != '\0')
     {
diff --git a/elf/rtld.c b/elf/rtld.c
index 304d07a5ba..c466fa28c9 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -261,7 +261,11 @@ match_version (const char *string, struct link_map *map)
   return 0;
 }
 
-unsigned int _dl_skip_args;	/* Nonzero if we were run directly.  */
+static unsigned int _dl_skip_args;	/* Nonzero if we were run directly.  */
+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.  */
 
 static void
 dl_main (const ElfW(Phdr) *phdr,
@@ -274,7 +278,6 @@ dl_main (const ElfW(Phdr) *phdr,
   enum mode mode;
   struct link_map **preloads;
   unsigned int npreloads;
-  const char *preloadlist;
   size_t file_size;
   char *file;
   int has_interp = 0;
@@ -303,9 +306,6 @@ dl_main (const ElfW(Phdr) *phdr,
 	 ourselves).  This is an easy way to test a new ld.so before
 	 installing it.  */
 
-      /* Overwrites LD_LIBRARY_PATH if given.  */
-      const char *library_path = NULL;
-
       /* Note the place where the dynamic linker actually came from.  */
       _dl_rtld_map.l_name = _dl_argv[0];
 
@@ -472,7 +472,7 @@ of this helper program; chances are you did not intend to run this program.\n",
   if (*user_entry != (ElfW(Addr)) &ENTRY_POINT)
     /* Initialize the data structures for the search paths for shared
        objects.  */
-    _dl_init_paths (NULL);
+    _dl_init_paths (library_path);
 
   /* Put the link_map for ourselves on the chain so it can be found by
      name.  Note that at this point the global chain of link maps contains
@@ -491,7 +491,6 @@ of this helper program; chances are you did not intend to run this program.\n",
   preloads = NULL;
   npreloads = 0;
 
-  preloadlist = getenv ("LD_PRELOAD");
   if (preloadlist)
     {
       /* The LD_PRELOAD environment variable gives list of libraries
@@ -732,7 +731,7 @@ of this helper program; chances are you did not intend to run this program.\n",
 	    }
 
 #define VERNEEDTAG (DT_NUM + DT_PROCNUM + DT_VERSIONTAGIDX (DT_VERNEED))
-	  if (*(getenv ("LD_VERBOSE") ?: "") != '\0')
+	  if (version_info)
 	    {
 	      /* Print more information.  This means here, print information
 		 about the versions needed.  */
@@ -1006,6 +1005,26 @@ process_envvars (enum mode *modep, int *lazyp)
       if (result < 0)
 	continue;
 
+      /* The library search path.  */
+      result = strncmp (&envline[3], "LIBRARY_PATH=", 13);
+      if (result == 0)
+	{
+	  library_path = &envline[16];
+	  continue;
+	}
+      if (result < 0)
+	continue;
+
+      /* List of objects to be preloaded.  */
+      result = strncmp (&envline[3], "PRELOAD=", 8);
+      if (result == 0)
+	{
+	  preloadlist = &envline[11];
+	  continue;
+	}
+      if (result < 0)
+	continue;
+
       /* Which shared object shall be profiled.  */
       result = strncmp (&envline[3], "PROFILE=", 8);
       if (result == 0)
@@ -1051,6 +1070,16 @@ process_envvars (enum mode *modep, int *lazyp)
       if (result < 0)
 	continue;
 
+      /* Print information about versions.  */
+      result = strncmp (&envline[3], "VERBOSE=", 8);
+      if (result == 0)
+	{
+	  version_info = envline[11] != '\0';
+	  continue;
+	}
+      if (result < 0)
+	continue;
+
       /* Warning level, verbose or not.  */
       result = strncmp (&envline[3], "WARN=", 5);
       if (result == 0)