aboutsummaryrefslogtreecommitdiff
path: root/elf
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2001-08-24 18:45:23 +0000
committerUlrich Drepper <drepper@redhat.com>2001-08-24 18:45:23 +0000
commit43a80540175e297d6003020a9980366d2cc4439c (patch)
tree1deaf5d7b4b3a42246137a81b11afad619691b23 /elf
parent77c88899c1919056c508fbaa345d6a5ae75387e6 (diff)
downloadglibc-43a80540175e297d6003020a9980366d2cc4439c.zip
glibc-43a80540175e297d6003020a9980366d2cc4439c.tar.gz
glibc-43a80540175e297d6003020a9980366d2cc4439c.tar.bz2
(elf_dynamic_do_rel): Fix problem with ld.so startup. Explicitly remove lazy part for RTLD_BOOTSTRAP since gcc doesn't do it.
Diffstat (limited to 'elf')
-rw-r--r--elf/do-rel.h11
1 files changed, 6 insertions, 5 deletions
diff --git a/elf/do-rel.h b/elf/do-rel.h
index e448635..8b9bdf2 100644
--- a/elf/do-rel.h
+++ b/elf/do-rel.h
@@ -48,6 +48,10 @@ elf_dynamic_do_rel (struct link_map *map,
const ElfW(Rel) *end = (const void *) (reladdr + relsize);
ElfW(Addr) l_addr = map->l_addr;
+#ifndef RTLD_BOOTSTRAP
+ /* We never bind lazily during ld.so bootstrap. Unfortunately gcc is
+ not clever enough to see through all the function calls to realize
+ that. */
if (lazy)
{
/* Doing lazy PLT relocations; they need very little info. */
@@ -55,17 +59,14 @@ elf_dynamic_do_rel (struct link_map *map,
elf_machine_lazy_rel (map, l_addr, r);
}
else
+#endif
{
const ElfW(Sym) *const symtab =
(const void *) D_PTR (map, l_info[DT_SYMTAB]);
-#ifndef RTLD_BOOTSTRAP
ElfW(Word) nrelative = (map->l_info[RELCOUNT_IDX] == NULL
? 0 : map->l_info[RELCOUNT_IDX]->d_un.d_val);
-#else
- ElfW(Word) nrelative = 0;
-#endif
const ElfW(Rel) *relative = r;
- r += nrelative;
+ r = MIN (r + nrelative, end);
#ifndef RTLD_BOOTSTRAP
/* This is defined in rtld.c, but nowhere in the static libc.a; make