mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-01 10:06:57 +03:00
Update.
* time/strftime.c (my_strftime): Delay use of *tp values until latest possible point to allow partly initialized structures (e.g., from strptime). * sysdeps/unix/sysv/linux/init-first.c [!PIC]: Define __libc_init_first using init-first.h. 1998-04-30 18:20 H.J. Lu <hjl@gnu.org> * elf/dl-load.c (_dl_init_paths): Don't check the dynamic loader if PIC is not defined. 1998-09-11 Ulrich Drepper <drepper@cygnus.com>
This commit is contained in:
133
elf/dl-load.c
133
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])
|
||||
{
|
||||
/* 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;
|
||||
|
||||
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);
|
||||
}
|
||||
/* 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 */
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user