diff options
Diffstat (limited to 'elf/dl-load.c')
-rw-r--r-- | elf/dl-load.c | 131 |
1 files changed, 66 insertions, 65 deletions
diff --git a/elf/dl-load.c b/elf/dl-load.c index 1082205a23..ba01300bfa 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -458,11 +458,13 @@ _dl_init_paths (const char *llp) struct r_search_path_elem *pelem, **aelem; size_t round_size; +#ifdef PIC /* We have in `search_path' the information about the RPATH of the dynamic loader. Now fill in the information about the applications RPATH and the directories addressed by the LD_LIBRARY_PATH environment variable. */ struct link_map *l; +#endif /* Number of elements in the library path. */ size_t nllp; @@ -526,84 +528,83 @@ _dl_init_paths (const char *llp) } *aelem = NULL; +#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); - - 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; - } - } - /* 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; + /* 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 (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); - } + 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 { - /* 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 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) - fake_path_list = NULL; + l->l_rpath_dirs = (struct r_search_path_elem **) -1l; else { - fake_path_list = (struct r_search_path_elem **) - malloc ((nllp + 1) * sizeof (struct r_search_path_elem *)); - if (fake_path_list == NULL) + 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"); - - (void) fillin_rpath (local_strdup (llp), fake_path_list, ":;", - __libc_enable_secure ? system_dirs : NULL, - "LD_LIBRARY_PATH", NULL); + 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); + } +#endif /* PIC */ } |