diff options
author | Ulrich Drepper <drepper@redhat.com> | 2001-08-24 18:45:23 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2001-08-24 18:45:23 +0000 |
commit | 43a80540175e297d6003020a9980366d2cc4439c (patch) | |
tree | 1deaf5d7b4b3a42246137a81b11afad619691b23 | |
parent | 77c88899c1919056c508fbaa345d6a5ae75387e6 (diff) | |
download | glibc-43a80540175e297d6003020a9980366d2cc4439c.tar.gz glibc-43a80540175e297d6003020a9980366d2cc4439c.tar.xz glibc-43a80540175e297d6003020a9980366d2cc4439c.zip |
(elf_dynamic_do_rel): Fix problem with ld.so startup. Explicitly remove lazy part for RTLD_BOOTSTRAP since gcc doesn't do it.
-rw-r--r-- | elf/do-rel.h | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/elf/do-rel.h b/elf/do-rel.h index e4486356b2..8b9bdf2da7 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 |