diff options
author | Andreas Jaeger <aj@suse.de> | 2000-04-18 18:31:00 +0000 |
---|---|---|
committer | Andreas Jaeger <aj@suse.de> | 2000-04-18 18:31:00 +0000 |
commit | 5166e402b8570a481bcf7c10e32632579af04b5e (patch) | |
tree | 41a0baf00f6169cf6be3308c029d4d560431f8b7 /sysdeps/mips | |
parent | 46737e2def50c93e243f3fc2582c083acda0c4f0 (diff) | |
download | glibc-5166e402b8570a481bcf7c10e32632579af04b5e.tar glibc-5166e402b8570a481bcf7c10e32632579af04b5e.tar.gz glibc-5166e402b8570a481bcf7c10e32632579af04b5e.tar.bz2 glibc-5166e402b8570a481bcf7c10e32632579af04b5e.zip |
2000-04-18 Andreas Jaeger <aj@suse.de>
* sysdeps/mips/dl-machine.h (elf_machine_rel): Fix relocation.
Diffstat (limited to 'sysdeps/mips')
-rw-r--r-- | sysdeps/mips/dl-machine.h | 39 |
1 files changed, 11 insertions, 28 deletions
diff --git a/sysdeps/mips/dl-machine.h b/sysdeps/mips/dl-machine.h index a15b78d52d..de5df0831b 100644 --- a/sysdeps/mips/dl-machine.h +++ b/sysdeps/mips/dl-machine.h @@ -428,40 +428,23 @@ elf_machine_rel (struct link_map *map, const ElfW(Rel) *reloc, const ElfW(Sym) *sym, const struct r_found_version *version, ElfW(Addr) *const reloc_addr) { - ElfW(Addr) loadbase; - ElfW(Addr) undo __attribute__ ((unused)); +#ifndef RTLD_BOOTSTRAP + /* This is defined in rtld.c, but nowhere in the static libc.a; + make the reference weak so static programs can still link. This + declaration cannot be done when compiling rtld.c (i.e. #ifdef + RTLD_BOOTSTRAP) because rtld.c contains the common defn for + _dl_rtld_map, which is incompatible with a weak decl in the same + file. */ + weak_extern (_dl_rtld_map); +#endif switch (ELFW(R_TYPE) (reloc->r_info)) { case R_MIPS_REL32: - { - ElfW(Addr) undo = 0; - - if (ELFW(ST_BIND) (sym->st_info) == STB_LOCAL - && (ELFW(ST_TYPE) (sym->st_info) == STT_SECTION - || ELFW(ST_TYPE) (sym->st_info) == STT_NOTYPE)) - { - *reloc_addr += map->l_addr; - break; - } #ifndef RTLD_BOOTSTRAP - /* This is defined in rtld.c, but nowhere in the static libc.a; - make the reference weak so static programs can still link. This - declaration cannot be done when compiling rtld.c (i.e. #ifdef - RTLD_BOOTSTRAP) because rtld.c contains the common defn for - _dl_rtld_map, which is incompatible with a weak decl in the same - file. */ - weak_extern (_dl_rtld_map); - if (map == &_dl_rtld_map) - /* Undo the relocation done here during bootstrapping. Now we will - relocate it anew, possibly using a binding found in the user - program or a loaded library rather than the dynamic linker's - built-in definitions used while loading those libraries. */ - undo = map->l_addr + sym->st_value; + if (map != &_dl_rtld_map) #endif - loadbase = RESOLVE (&sym, version, R_MIPS_REL32); - *reloc_addr += (sym ? (loadbase + sym->st_value) : 0) - undo; - } + *reloc_addr += map->l_addr; break; case R_MIPS_NONE: /* Alright, Wilbur. */ break; |