aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--elf/dynamic-link.h33
2 files changed, 29 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 53d321496f..ad0ff35235 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>
* Versions.def (libc): Add GLIBC_PRIVATE.
diff --git a/elf/dynamic-link.h b/elf/dynamic-link.h
index 8792b8e4b6..b0baa901fd 100644
--- a/elf/dynamic-link.h
+++ b/elf/dynamic-link.h
@@ -32,13 +32,13 @@ static inline void __attribute__ ((unused))
elf_get_dynamic_info (struct link_map *l)
{
ElfW(Dyn) *dyn = l->l_ld;
- ElfW(Addr) l_addr;
ElfW(Dyn) **info;
- if (! dyn)
+#ifndef RTLD_BOOTSTRAP
+ if (dyn == NULL)
return;
+#endif
- l_addr = l->l_addr;
info = l->l_info;
while (dyn->d_tag != DT_NULL)
@@ -65,8 +65,10 @@ elf_get_dynamic_info (struct link_map *l)
}
#ifndef DL_RO_DYN_SECTION
/* 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)
info[DT_PLTGOT]->d_un.d_ptr += l_addr;
if (info[DT_STRTAB] != NULL)
@@ -89,23 +91,27 @@ elf_get_dynamic_info (struct link_map *l)
#endif
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);
-# elif ELF_MACHINE_NO_REL
+#elif ELF_MACHINE_NO_REL
assert (info[DT_PLTREL]->d_un.d_val == DT_RELA);
-# else
+#else
assert (info[DT_PLTREL]->d_un.d_val == DT_REL
|| 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)
assert (info[DT_RELAENT]->d_un.d_val == sizeof (ElfW(Rela)));
# endif
# if ! ELF_MACHINE_NO_REL
if (info[DT_REL] != NULL)
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)
{
/* 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)
info[DT_BIND_NOW] = info[DT_FLAGS];
}
+#endif
if (info[VERSYMIDX (DT_FLAGS_1)] != NULL)
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 both RUNPATH and RPATH are given, the latter is ignored. */
info[DT_RPATH] = NULL;
+#endif
}
#ifdef RESOLVE