diff options
author | Ulrich Drepper <drepper@redhat.com> | 2001-08-24 17:18:04 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2001-08-24 17:18:04 +0000 |
commit | 95c78350280b653055f980b9388d45f249984974 (patch) | |
tree | adf80906b1b465d115a3af615772ed523429d7e6 /elf | |
parent | 3dc51a93dec50c74f6cbcc486e3153f585955a72 (diff) | |
download | glibc-95c78350280b653055f980b9388d45f249984974.zip glibc-95c78350280b653055f980b9388d45f249984974.tar.gz glibc-95c78350280b653055f980b9388d45f249984974.tar.bz2 |
Update.
* elf/do-rel.h (elf_dynamic_do_rel) [RTLD_BOOTSTRAP]: Disable use of
RELCOUNT for now until we know what is wrong with it.
2001-08-24 Jakub Jelinek <jakub@redhat.com>
* elf/do-rel.h (elf_dynamic_do_rel): If l_addr is 0, skip relative
records. Rename endrel to relative, initialize it to r, and use it
in elf_machine_rel_relative calls. Point r after relative relocs.
2001-08-24 Ulrich Drepper <drepper@redhat.com>
Diffstat (limited to 'elf')
-rw-r--r-- | elf/do-rel.h | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/elf/do-rel.h b/elf/do-rel.h index fa84522..e448635 100644 --- a/elf/do-rel.h +++ b/elf/do-rel.h @@ -58,9 +58,14 @@ elf_dynamic_do_rel (struct link_map *map, { 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); - const ElfW(Rel) *endrel = r + nrelative; +#else + ElfW(Word) nrelative = 0; +#endif + const ElfW(Rel) *relative = r; + r += nrelative; #ifndef RTLD_BOOTSTRAP /* This is defined in rtld.c, but nowhere in the static libc.a; make @@ -71,10 +76,17 @@ elf_dynamic_do_rel (struct link_map *map, file. */ weak_extern (_dl_rtld_map); if (map != &_dl_rtld_map) /* Already done in rtld itself. */ +# ifndef DO_RELA + /* Rela platforms get the offset from r_addend and this must + be copied in the relocation address. Therefore we can skip + the relative relocations only if this is for rel + relocations. */ + if (l_addr != 0) +# endif #endif - for (; r < endrel; ++r) - elf_machine_rel_relative (l_addr, r, - (void *) (l_addr + r->r_offset)); + for (; relative < r; ++relative) + elf_machine_rel_relative (l_addr, relative, + (void *) (l_addr + relative->r_offset)); if (map->l_info[VERSYMIDX (DT_VERSYM)]) { |