about summary refs log tree commit diff
path: root/elf
diff options
context:
space:
mode:
Diffstat (limited to 'elf')
-rw-r--r--elf/dl-reloc.c2
-rw-r--r--elf/rtld.c62
2 files changed, 33 insertions, 31 deletions
diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
index c829de797f..dbbc19c233 100644
--- a/elf/dl-reloc.c
+++ b/elf/dl-reloc.c
@@ -91,7 +91,7 @@ cannot make segment writable for relocation"));
 #include "dynamic-link.h"
     ELF_DYNAMIC_RELOCATE (l, lazy, consider_profiling);
 
-    if (__builtin_expect (_dl_profile != NULL, 0))
+    if (__builtin_expect (consider_profiling, 0))
       {
 	/* Allocate the array which will contain the already found
 	   relocations.  If the shared object lacks a PLT (for example
diff --git a/elf/rtld.c b/elf/rtld.c
index 2eddb5a40a..b32de61888 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -1282,10 +1282,12 @@ warning: debug option `%s' unknown; try LD_DEBUG=help\n", startp);
 /* Process all environments variables the dynamic linker must recognize.
    Since all of them start with `LD_' we are a bit smarter while finding
    all the entries.  */
+extern char **_environ;
+
 static void
 process_envvars (enum mode *modep)
 {
-  char **runp = NULL;
+  char **runp = _environ;
   char *envline;
   enum mode mode = normal;
   char *debug_output = NULL;
@@ -1301,98 +1303,98 @@ process_envvars (enum mode *modep)
 	/* This is a "LD_" variable at the end of the string without
 	   a '=' character.  Ignore it since otherwise we will access
 	   invalid memory below.  */
-	break;
+	continue;
 
-      switch (len - 3)
+      switch (len)
 	{
 	case 4:
 	  /* Warning level, verbose or not.  */
-	  if (memcmp (&envline[3], "WARN", 4) == 0)
-	    _dl_verbose = envline[8] != '\0';
+	  if (memcmp (envline, "WARN", 4) == 0)
+	    _dl_verbose = envline[5] != '\0';
 	  break;
 
 	case 5:
 	  /* Debugging of the dynamic linker?  */
-	  if (memcmp (&envline[3], "DEBUG", 5) == 0)
-	    process_dl_debug (&envline[9]);
+	  if (memcmp (envline, "DEBUG", 5) == 0)
+	    process_dl_debug (&envline[6]);
 	  break;
 
 	case 7:
 	  /* Print information about versions.  */
-	  if (memcmp (&envline[3], "VERBOSE", 7) == 0)
+	  if (memcmp (envline, "VERBOSE", 7) == 0)
 	    {
-	      version_info = envline[11] != '\0';
+	      version_info = envline[8] != '\0';
 	      break;
 	    }
 
 	  /* List of objects to be preloaded.  */
-	  if (memcmp (&envline[3], "PRELOAD", 7) == 0)
+	  if (memcmp (envline, "PRELOAD", 7) == 0)
 	    {
-	      preloadlist = &envline[11];
+	      preloadlist = &envline[8];
 	      break;
 	    }
 
 	  /* Which shared object shall be profiled.  */
-	  if (memcmp (&envline[3], "PROFILE", 7) == 0)
-	    _dl_profile = &envline[11];
+	  if (memcmp (envline, "PROFILE", 7) == 0)
+	    _dl_profile = &envline[8];
 	  break;
 
 	case 8:
 	  /* Do we bind early?  */
-	  if (memcmp (&envline[3], "BIND_NOW", 8) == 0)
+	  if (memcmp (envline, "BIND_NOW", 8) == 0)
 	    {
-	      _dl_lazy = envline[12] == '\0';
+	      _dl_lazy = envline[9] == '\0';
 	      break;
 	    }
-	  if (memcmp (&envline[3], "BIND_NOT", 8) == 0)
-	    _dl_bind_not = envline[12] != '\0';
+	  if (memcmp (envline, "BIND_NOT", 8) == 0)
+	    _dl_bind_not = envline[9] != '\0';
 	  break;
 
 	case 9:
 	  /* Test whether we want to see the content of the auxiliary
 	     array passed up from the kernel.  */
-	  if (memcmp (&envline[3], "SHOW_AUXV", 9) == 0)
+	  if (memcmp (envline, "SHOW_AUXV", 9) == 0)
 	    _dl_show_auxv ();
 	  break;
 
 	case 10:
 	  /* Mask for the important hardware capabilities.  */
-	  if (memcmp (&envline[3], "HWCAP_MASK", 10) == 0)
-	    _dl_hwcap_mask = __strtoul_internal (&envline[14], NULL, 0, 0);
+	  if (memcmp (envline, "HWCAP_MASK", 10) == 0)
+	    _dl_hwcap_mask = __strtoul_internal (&envline[11], NULL, 0, 0);
 	  break;
 
 	case 11:
 	  /* Path where the binary is found.  */
 	  if (!__libc_enable_secure
-	      && memcmp (&envline[3], "ORIGIN_PATH", 11) == 0)
-	    _dl_origin_path = &envline[15];
+	      && memcmp (envline, "ORIGIN_PATH", 11) == 0)
+	    _dl_origin_path = &envline[12];
 	  break;
 
 	case 12:
 	  /* The library search path.  */
-	  if (memcmp (&envline[3], "LIBRARY_PATH", 12) == 0)
+	  if (memcmp (envline, "LIBRARY_PATH", 12) == 0)
 	    {
-	      library_path = &envline[16];
+	      library_path = &envline[13];
 	      break;
 	    }
 
 	  /* Where to place the profiling data file.  */
-	  if (memcmp (&envline[3], "DEBUG_OUTPUT", 12) == 0)
+	  if (memcmp (envline, "DEBUG_OUTPUT", 12) == 0)
 	    {
-	      debug_output = &envline[16];
+	      debug_output = &envline[13];
 	      break;
 	    }
 
-	  if (memcmp (&envline[3], "DYNAMIC_WEAK", 12) == 0)
+	  if (memcmp (envline, "DYNAMIC_WEAK", 12) == 0)
 	    _dl_dynamic_weak = 1;
 	  break;
 
 	case 14:
 	  /* Where to place the profiling data file.  */
 	  if (!__libc_enable_secure
-	      && memcmp (&envline[3], "PROFILE_OUTPUT", 14) == 0)
+	      && memcmp (envline, "PROFILE_OUTPUT", 14) == 0)
 	    {
-	      _dl_profile_output = &envline[18];
+	      _dl_profile_output = &envline[15];
 	      if (*_dl_profile_output == '\0')
 		_dl_profile_output = "/var/tmp";
 	    }
@@ -1400,7 +1402,7 @@ process_envvars (enum mode *modep)
 
 	case 20:
 	  /* The mode of the dynamic linker can be set.  */
-	  if (memcmp (&envline[3], "TRACE_LOADED_OBJECTS", 20) == 0)
+	  if (memcmp (envline, "TRACE_LOADED_OBJECTS", 20) == 0)
 	    mode = trace;
 	  break;