diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | sysdeps/mips/add_n.S | 7 | ||||
-rw-r--r-- | sysdeps/mips/dl-machine.h | 73 |
3 files changed, 44 insertions, 41 deletions
diff --git a/ChangeLog b/ChangeLog index 9f2d9e0774..b479812284 100644 --- a/ChangeLog +++ b/ChangeLog @@ -7,6 +7,11 @@ 2000-04-14 Andreas Jaeger <aj@suse.de> + * sysdeps/mips/dl-machine.h (elf_machine_got_rel): Initialize + symidx correctly. + + * sysdeps/mips/add_n.S: Use __PIC__, add .end directive. + * stdlib/stdlib.h: Fix typo in comment. * shlib-versions (mips.*-.*-linux.*): Support only GLIBC 2.0 and diff --git a/sysdeps/mips/add_n.S b/sysdeps/mips/add_n.S index df32eecfcf..aa94c1d001 100644 --- a/sysdeps/mips/add_n.S +++ b/sysdeps/mips/add_n.S @@ -1,7 +1,7 @@ /* MIPS2 __mpn_add_n -- Add two limb vectors of the same length > 0 and store sum in a third limb vector. -Copyright (C) 1995 Free Software Foundation, Inc. +Copyright (C) 1995, 2000 Free Software Foundation, Inc. This file is part of the GNU MP Library. @@ -28,12 +28,12 @@ MA 02111-1307, USA. */ s2_ptr $6 size $7 */ -#ifdef PIC +#ifdef __PIC__ .option pic2 #endif ENTRY (__mpn_add_n) .set noreorder -#ifdef PIC +#ifdef __PIC__ .cpload t9 #endif .set nomacro @@ -119,3 +119,4 @@ ENTRY (__mpn_add_n) sw $11,0($4) j $31 or $2,$2,$8 + .end __mpn_add_n \ No newline at end of file diff --git a/sysdeps/mips/dl-machine.h b/sysdeps/mips/dl-machine.h index 0d971e23d0..5c628ce187 100644 --- a/sysdeps/mips/dl-machine.h +++ b/sysdeps/mips/dl-machine.h @@ -126,6 +126,8 @@ elf_machine_load_address (void) return addr; } +/* The MSB of got[1] of a gnu object is set to identify gnu objects. */ +#define ELF_MIPS_GNU_GOT1_MASK 0x80000000 /* Get link map for callers object containing STUB_PC. */ static inline struct link_map * @@ -476,9 +478,6 @@ elf_machine_lazy_rel (struct link_map *map, /* Do nothing. */ } -/* The MSB of got[1] of a gnu object is set to identify gnu objects. */ -#define ELF_MIPS_GNU_GOT1_MASK 0x80000000 - /* Relocate GOT. */ static inline void elf_machine_got_rel (struct link_map *map, int lazy) @@ -492,37 +491,36 @@ elf_machine_got_rel (struct link_map *map, int lazy) #ifdef RTLD_BOOTSTRAP # define RESOLVE_GOTSYM(sym,sym_index) 0 #else - /* FIXME: The macro RESOLVE_GOTSYM is not handling versioning. */ -# define RESOLVE_GOTSYM(sym,sym_index) \ - ({ \ - const ElfW(Sym) *ref = sym; \ - ElfW(Addr) value; \ - \ - switch (map->l_info[VERSYMIDX (DT_VERSYM)] != NULL) \ - { \ - default: \ - { \ - const ElfW(Half) *vernum = \ - (const void *) D_PTR (map, l_info[VERSYMIDX (DT_VERSYM)]); \ - ElfW(Half) ndx = vernum[sym_index]; \ - const struct r_found_version *version = &l->l_versions[ndx]; \ - \ - if (version->hash != 0) \ - { \ - value = _dl_lookup_versioned_symbol(strtab + sym->st_name, \ - map, \ - &ref, scope, version, \ - R_MIPS_REL32); \ - break; \ - } \ - /* Fall through. */ \ - } \ - case 0: \ - value = _dl_lookup_symbol (strtab + sym->st_name, map, &ref, \ - scope, R_MIPS_REL32); \ - } \ - \ - (ref)? value + ref->st_value: 0; \ +# define RESOLVE_GOTSYM(sym,sym_index) \ + ({ \ + const ElfW(Sym) *ref = sym; \ + ElfW(Addr) value; \ + \ + switch (map->l_info[VERSYMIDX (DT_VERSYM)] != NULL) \ + { \ + default: \ + { \ + const ElfW(Half) *vernum = \ + (const void *) D_PTR (map, l_info[VERSYMIDX (DT_VERSYM)]); \ + ElfW(Half) ndx = vernum[sym_index]; \ + const struct r_found_version *version = &l->l_versions[ndx]; \ + \ + if (version->hash != 0) \ + { \ + value = _dl_lookup_versioned_symbol(strtab + sym->st_name,\ + map, \ + &ref, scope, version, \ + R_MIPS_REL32); \ + break; \ + } \ + /* Fall through. */ \ + } \ + case 0: \ + value = _dl_lookup_symbol (strtab + sym->st_name, map, &ref, \ + scope, R_MIPS_REL32); \ + } \ + \ + (ref)? value + ref->st_value: 0; \ }) #endif /* RTLD_BOOTSTRAP */ @@ -541,12 +539,11 @@ elf_machine_got_rel (struct link_map *map, int lazy) /* Handle global got entries. */ got += n; - sym = (void *) D_PTR (map, l_info[DT_SYMTAB]); - sym += map->l_info[DT_MIPS (GOTSYM)]->d_un.d_val; + /* Keep track of the symbol index. */ + symidx = map->l_info[DT_MIPS (GOTSYM)]->d_un.d_val; + sym = (void *) D_PTR (map, l_info[DT_SYMTAB]) + symidx; i = (map->l_info[DT_MIPS (SYMTABNO)]->d_un.d_val - map->l_info[DT_MIPS (GOTSYM)]->d_un.d_val); - /* Keep track of the symbol index. */ - symidx = n; while (i--) { |