about summary refs log tree commit diff
path: root/elf/dl-load.c
diff options
context:
space:
mode:
Diffstat (limited to 'elf/dl-load.c')
-rw-r--r--elf/dl-load.c128
1 files changed, 66 insertions, 62 deletions
diff --git a/elf/dl-load.c b/elf/dl-load.c
index ba01300bfa..b93258e9eb 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -531,80 +531,84 @@ _dl_init_paths (const char *llp)
 #ifdef PIC
   /* This points to the map of the main object.  */
   l = _dl_loaded;
+  if (l != NULL)
+    {
+      /* We should never get here when initializing in a static application.
+	 If this is a dynamically linked application _dl_loaded always
+	 points to the main map which is not dlopen()ed.  */
+      assert (l->l_type != lt_loaded);
 
-  /* We should never get here when initializing in a static application.
-     If this is a dynamically linked application _dl_loaded always
-     points to the main map which is not dlopen()ed.  */
-  assert (l->l_type != lt_loaded);
+      if (l->l_info[DT_RPATH])
+	{
+	  /* Allocate room for the search path and fill in information
+	     from RPATH.  */
+	  l->l_rpath_dirs =
+	    decompose_rpath ((const char *)
+			     (l->l_addr + l->l_info[DT_STRTAB]->d_un.d_ptr
+			      + l->l_info[DT_RPATH]->d_un.d_val),
+			     nllp, l);
+	}
+      else
+	{
+	  /* If we have no LD_LIBRARY_PATH and no RPATH we must tell
+	     this somehow to prevent we look this up again and again.  */
+	  if (nllp == 0)
+	    l->l_rpath_dirs = (struct r_search_path_elem **) -1l;
+	  else
+	    {
+	      l->l_rpath_dirs = (struct r_search_path_elem **)
+		malloc ((nllp + 1) * sizeof (*l->l_rpath_dirs));
+	      if (l->l_rpath_dirs == NULL)
+		_dl_signal_error (ENOMEM, NULL,
+				  "cannot create cache for search path");
+	      l->l_rpath_dirs[0] = NULL;
+	    }
+	}
 
-  if (l->l_info[DT_RPATH])
-    {
-      /* Allocate room for the search path and fill in information
-	 from RPATH.  */
-      l->l_rpath_dirs =
-	decompose_rpath ((const char *)
-			 (l->l_addr + l->l_info[DT_STRTAB]->d_un.d_ptr
-			  + l->l_info[DT_RPATH]->d_un.d_val),
-			 nllp, l);
+      /* We don't need to search the list of fake entries which is searched
+	 when no dynamic objects were loaded at this time.  */
+      fake_path_list = NULL;
+
+      if (nllp > 0)
+	{
+	  char *copy = local_strdup (llp);
+
+	  /* Decompose the LD_LIBRARY_PATH and fill in the result.
+	     First search for the next place to enter elements.  */
+	  struct r_search_path_elem **result = l->l_rpath_dirs;
+	  while (*result != NULL)
+	    ++result;
+
+	  /* We need to take care that the LD_LIBRARY_PATH environment
+	     variable can contain a semicolon.  */
+	  (void) fillin_rpath (copy, result, ":;",
+			       __libc_enable_secure ? system_dirs : NULL,
+			       "LD_LIBRARY_PATH", NULL);
+	}
     }
   else
+#endif	/* PIC */
     {
-      /* If we have no LD_LIBRARY_PATH and no RPATH we must tell
-	 this somehow to prevent we look this up again and again.  */
+      /* This is a statically linked program but we still have to take
+	 care for the LD_LIBRARY_PATH environment variable.  We use a fake
+	 link_map entry.  This will only contain the l_rpath_dirs
+	 information.  */
+
       if (nllp == 0)
-	l->l_rpath_dirs = (struct r_search_path_elem **) -1l;
+	fake_path_list = NULL;
       else
 	{
-	  l->l_rpath_dirs = (struct r_search_path_elem **)
-	    malloc ((nllp + 1) * sizeof (*l->l_rpath_dirs));
-	  if (l->l_rpath_dirs == NULL)
+	  fake_path_list = (struct r_search_path_elem **)
+	    malloc ((nllp + 1) * sizeof (struct r_search_path_elem *));
+	  if (fake_path_list == NULL)
 	    _dl_signal_error (ENOMEM, NULL,
 			      "cannot create cache for search path");
-	  l->l_rpath_dirs[0] = NULL;
-	}
-    }
-
-  /* We don't need to search the list of fake entries which is searched
-     when no dynamic objects were loaded at this time.  */
-  fake_path_list = NULL;
 
-  if (nllp > 0)
-    {
-      char *copy = local_strdup (llp);
-
-      /* Decompose the LD_LIBRARY_PATH and fill in the result.
-	 First search for the next place to enter elements.  */
-      struct r_search_path_elem **result = l->l_rpath_dirs;
-      while (*result != NULL)
-	++result;
-
-      /* We need to take care that the LD_LIBRARY_PATH environment
-	 variable can contain a semicolon.  */
-      (void) fillin_rpath (copy, result, ":;",
-			   __libc_enable_secure ? system_dirs : NULL,
-			   "LD_LIBRARY_PATH", NULL);
-    }
-#else	/* !PIC */
-  /* This is a statically linked program but we still have to take
-     care for the LD_LIBRARY_PATH environment variable.  We use a fake
-     link_map entry.  This will only contain the l_rpath_dirs
-     information.  */
-
-  if (nllp == 0)
-    fake_path_list = NULL;
-  else
-    {
-      fake_path_list = (struct r_search_path_elem **)
-	malloc ((nllp + 1) * sizeof (struct r_search_path_elem *));
-      if (fake_path_list == NULL)
-	_dl_signal_error (ENOMEM, NULL,
-			  "cannot create cache for search path");
-
-      (void) fillin_rpath (local_strdup (llp), fake_path_list, ":;",
-			   __libc_enable_secure ? system_dirs : NULL,
-			   "LD_LIBRARY_PATH", NULL);
+	  (void) fillin_rpath (local_strdup (llp), fake_path_list, ":;",
+			       __libc_enable_secure ? system_dirs : NULL,
+			       "LD_LIBRARY_PATH", NULL);
+	}
     }
-#endif	/* PIC */
 }