mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-26 06:50:07 +00:00
Update.
2002-02-01 Ulrich Drepper <drepper@redhat.com> * elf/dynamic-link.h (elf_get_dynamic_info): Optimize a bit for starting ld.so itself. Move l_addr variable initialization closer to use.
This commit is contained in:
parent
fb23eb252f
commit
56c574425d
@ -1,3 +1,9 @@
|
|||||||
|
2002-02-01 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* elf/dynamic-link.h (elf_get_dynamic_info): Optimize a bit for
|
||||||
|
starting ld.so itself. Move l_addr variable initialization closer
|
||||||
|
to use.
|
||||||
|
|
||||||
2002-02-01 Jakub Jelinek <jakub@redhat.com>
|
2002-02-01 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
* Versions.def (libc): Add GLIBC_PRIVATE.
|
* Versions.def (libc): Add GLIBC_PRIVATE.
|
||||||
|
@ -32,13 +32,13 @@ static inline void __attribute__ ((unused))
|
|||||||
elf_get_dynamic_info (struct link_map *l)
|
elf_get_dynamic_info (struct link_map *l)
|
||||||
{
|
{
|
||||||
ElfW(Dyn) *dyn = l->l_ld;
|
ElfW(Dyn) *dyn = l->l_ld;
|
||||||
ElfW(Addr) l_addr;
|
|
||||||
ElfW(Dyn) **info;
|
ElfW(Dyn) **info;
|
||||||
|
|
||||||
if (! dyn)
|
#ifndef RTLD_BOOTSTRAP
|
||||||
|
if (dyn == NULL)
|
||||||
return;
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
l_addr = l->l_addr;
|
|
||||||
info = l->l_info;
|
info = l->l_info;
|
||||||
|
|
||||||
while (dyn->d_tag != DT_NULL)
|
while (dyn->d_tag != DT_NULL)
|
||||||
@ -65,8 +65,10 @@ elf_get_dynamic_info (struct link_map *l)
|
|||||||
}
|
}
|
||||||
#ifndef DL_RO_DYN_SECTION
|
#ifndef DL_RO_DYN_SECTION
|
||||||
/* Don't adjust .dynamic unnecessarily. */
|
/* Don't adjust .dynamic unnecessarily. */
|
||||||
if (l_addr)
|
if (l->l_addr != 0)
|
||||||
{
|
{
|
||||||
|
ElfW(Addr) l_addr = l->l_addr;
|
||||||
|
|
||||||
if (info[DT_PLTGOT] != NULL)
|
if (info[DT_PLTGOT] != NULL)
|
||||||
info[DT_PLTGOT]->d_un.d_ptr += l_addr;
|
info[DT_PLTGOT]->d_un.d_ptr += l_addr;
|
||||||
if (info[DT_STRTAB] != NULL)
|
if (info[DT_STRTAB] != NULL)
|
||||||
@ -89,23 +91,27 @@ elf_get_dynamic_info (struct link_map *l)
|
|||||||
#endif
|
#endif
|
||||||
if (info[DT_PLTREL] != NULL)
|
if (info[DT_PLTREL] != NULL)
|
||||||
{
|
{
|
||||||
# if ELF_MACHINE_NO_RELA
|
#if ELF_MACHINE_NO_RELA
|
||||||
assert (info[DT_PLTREL]->d_un.d_val == DT_REL);
|
assert (info[DT_PLTREL]->d_un.d_val == DT_REL);
|
||||||
# elif ELF_MACHINE_NO_REL
|
#elif ELF_MACHINE_NO_REL
|
||||||
assert (info[DT_PLTREL]->d_un.d_val == DT_RELA);
|
assert (info[DT_PLTREL]->d_un.d_val == DT_RELA);
|
||||||
# else
|
#else
|
||||||
assert (info[DT_PLTREL]->d_un.d_val == DT_REL
|
assert (info[DT_PLTREL]->d_un.d_val == DT_REL
|
||||||
|| info[DT_PLTREL]->d_un.d_val == DT_RELA);
|
|| info[DT_PLTREL]->d_un.d_val == DT_RELA);
|
||||||
# endif
|
#endif
|
||||||
}
|
}
|
||||||
# if ! ELF_MACHINE_NO_RELA
|
#if ! ELF_MACHINE_NO_RELA
|
||||||
if (info[DT_RELA] != NULL)
|
if (info[DT_RELA] != NULL)
|
||||||
assert (info[DT_RELAENT]->d_un.d_val == sizeof (ElfW(Rela)));
|
assert (info[DT_RELAENT]->d_un.d_val == sizeof (ElfW(Rela)));
|
||||||
# endif
|
# endif
|
||||||
# if ! ELF_MACHINE_NO_REL
|
# if ! ELF_MACHINE_NO_REL
|
||||||
if (info[DT_REL] != NULL)
|
if (info[DT_REL] != NULL)
|
||||||
assert (info[DT_RELENT]->d_un.d_val == sizeof (ElfW(Rel)));
|
assert (info[DT_RELENT]->d_un.d_val == sizeof (ElfW(Rel)));
|
||||||
# endif
|
#endif
|
||||||
|
#ifdef RTLD_BOOTSTRAP
|
||||||
|
/* None of the flags should be set for the dynamic linker itself. */
|
||||||
|
assert (info[DT_FLAGS] == NULL);
|
||||||
|
#else
|
||||||
if (info[DT_FLAGS] != NULL)
|
if (info[DT_FLAGS] != NULL)
|
||||||
{
|
{
|
||||||
/* Flags are used. Translate to the old form where available.
|
/* Flags are used. Translate to the old form where available.
|
||||||
@ -119,11 +125,18 @@ elf_get_dynamic_info (struct link_map *l)
|
|||||||
if (flags & DF_BIND_NOW)
|
if (flags & DF_BIND_NOW)
|
||||||
info[DT_BIND_NOW] = info[DT_FLAGS];
|
info[DT_BIND_NOW] = info[DT_FLAGS];
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if (info[VERSYMIDX (DT_FLAGS_1)] != NULL)
|
if (info[VERSYMIDX (DT_FLAGS_1)] != NULL)
|
||||||
l->l_flags_1 = info[VERSYMIDX (DT_FLAGS_1)]->d_un.d_val;
|
l->l_flags_1 = info[VERSYMIDX (DT_FLAGS_1)]->d_un.d_val;
|
||||||
|
#ifdef RTLD_BOOTSTRAP
|
||||||
|
/* The dynamic linker should have none of these set. */
|
||||||
|
assert (info[DT_RUNPATH] == NULL);
|
||||||
|
assert (info[DT_RPATH] == NULL);
|
||||||
|
#else
|
||||||
if (info[DT_RUNPATH] != NULL)
|
if (info[DT_RUNPATH] != NULL)
|
||||||
/* If both RUNPATH and RPATH are given, the latter is ignored. */
|
/* If both RUNPATH and RPATH are given, the latter is ignored. */
|
||||||
info[DT_RPATH] = NULL;
|
info[DT_RPATH] = NULL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef RESOLVE
|
#ifdef RESOLVE
|
||||||
|
Loading…
Reference in New Issue
Block a user