aboutsummaryrefslogtreecommitdiff
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 ba01300..b93258e 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 */
}