On Fri, Jul 13, 2001 at 09:06:49AM -0700, Ulrich Drepper wrote: > Ralf Baechle <ralf@oss.sgi.com> writes: > > > So please, go ahead. > > So you say the patch is OK from your POV? > My last patch was not ok :-(. Somehow, make didn't rebuild. In this patch, I rewrote RESOLVE_GOTSYM with RESOLVE to help prelink. H.J. ----- 2001-07-13 H.J. Lu <hjl@gnu.org> * sysdeps/mips/dl-machine.h (MAP_BASE_ADDR): Removed. (elf_machine_got_rel): Defined only if RTLD_BOOTSTRAP is not defined. (RESOLVE_GOTSYM): Rewrite to use RESOLVE. * sysdeps/mips/rtld-ldscript.in: Removed. * sysdeps/mips/rtld-parms: Likewise. * sysdeps/mips/mips64/rtld-parms: Likewise. * sysdeps/mips/mipsel/rtld-parms: Likewise. --- libc/sysdeps/mips/dl-machine.h.mips Sat Jul 7 16:46:05 2001 +++ libc/sysdeps/mips/dl-machine.h Fri Jul 13 10:53:42 2001 @@ -61,23 +61,6 @@ in l_info array. */ #define DT_MIPS(x) (DT_MIPS_##x - DT_LOPROC + DT_NUM) -/* - * MIPS libraries are usually linked to a non-zero base address. We - * subtract the base address from the address where we map the object - * to. This results in more efficient address space usage. - * - * FIXME: By the time when MAP_BASE_ADDR is called we don't have the - * DYNAMIC section read. Until this is fixed make the assumption that - * libraries have their base address at 0x5ffe0000. This needs to be - * fixed before we can safely get rid of this MIPSism. - */ -#if 0 -#define MAP_BASE_ADDR(l) ((l)->l_info[DT_MIPS(BASE_ADDRESS)] ? \ - (l)->l_info[DT_MIPS(BASE_ADDRESS)]->d_un.d_ptr : 0) -#else -#define MAP_BASE_ADDR(l) 0x5ffe0000 -#endif - /* If there is a DT_MIPS_RLD_MAP entry in the dynamic section, fill it in with the run-time address of the r_debug structure */ #define ELF_MACHINE_DEBUG_SETUP(l,r) \ @@ -557,51 +540,30 @@ elf_machine_lazy_rel (struct link_map *m /* Do nothing. */ } +#ifndef RTLD_BOOTSTRAP /* Relocate GOT. */ static inline void elf_machine_got_rel (struct link_map *map, int lazy) { ElfW(Addr) *got; ElfW(Sym) *sym; + const ElfW(Half) *vernum; int i, n, symidx; - /* This function is loaded in dl-reloc as a nested function and can - therefore access the variables scope and strtab from - _dl_relocate_object. */ -#ifdef RTLD_BOOTSTRAP -# define RESOLVE_GOTSYM(sym,sym_index) 0 -#else -# define RESOLVE_GOTSYM(sym,sym_index) \ + +#define RESOLVE_GOTSYM(sym,vernum,sym_index) \ ({ \ const ElfW(Sym) *ref = sym; \ + const struct r_found_version *version \ + = vernum ? &map->l_versions [vernum [sym_index]] : NULL; \ 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, 0); \ - break; \ - } \ - /* Fall through. */ \ - } \ - case 0: \ - value = _dl_lookup_symbol (strtab + sym->st_name, map, &ref, \ - scope, R_MIPS_REL32, 0); \ - } \ - \ + value = RESOLVE (&ref, version, R_MIPS_REL32); \ (ref)? value + ref->st_value: 0; \ }) -#endif /* RTLD_BOOTSTRAP */ + + if (map->l_info[VERSYMIDX (DT_VERSYM)] != NULL) + vernum = (const void *) D_PTR (map, l_info[VERSYMIDX (DT_VERSYM)]); + else + vernum = NULL; got = (ElfW(Addr) *) D_PTR (map, l_info[DT_PLTGOT]); @@ -639,10 +601,10 @@ elf_machine_got_rel (struct link_map *ma && sym->st_value && lazy) *got = sym->st_value + map->l_addr; else - *got = RESOLVE_GOTSYM (sym, symidx); + *got = RESOLVE_GOTSYM (sym, vernum, symidx); } else if (sym->st_shndx == SHN_COMMON) - *got = RESOLVE_GOTSYM (sym, symidx); + *got = RESOLVE_GOTSYM (sym, vernum, symidx); else if (ELFW(ST_TYPE) (sym->st_info) == STT_FUNC && *got != sym->st_value && lazy) @@ -653,7 +615,7 @@ elf_machine_got_rel (struct link_map *ma *got += map->l_addr; } else - *got = RESOLVE_GOTSYM (sym, symidx); + *got = RESOLVE_GOTSYM (sym, vernum, symidx); ++got; ++sym; @@ -661,9 +623,8 @@ elf_machine_got_rel (struct link_map *ma } #undef RESOLVE_GOTSYM - - return; } +#endif /* Set up the loaded object described by L so its stub function will jump to the on-demand fixup code __dl_runtime_resolve. */ --- libc/sysdeps/mips/mips64/rtld-parms.mips Sat Jul 12 16:26:11 1997 +++ libc/sysdeps/mips/mips64/rtld-parms Fri Jul 13 10:54:55 2001 @@ -1,3 +0,0 @@ -ifndef rtld-wordsize -rtld-wordsize = 64 -endif --- libc/sysdeps/mips/mipsel/rtld-parms.mips Sat Jul 12 16:26:15 1997 +++ libc/sysdeps/mips/mipsel/rtld-parms Fri Jul 13 10:54:55 2001 @@ -1,3 +0,0 @@ -ifndef rtld-oformat -rtld-oformat = elf32-littlemips -endif --- libc/sysdeps/mips/rtld-ldscript.in.mips Sun May 13 20:39:31 2001 +++ libc/sysdeps/mips/rtld-ldscript.in Fri Jul 13 10:54:55 2001 @@ -1,105 +0,0 @@ -OUTPUT_ARCH(@@rtld-arch@@) -ENTRY(@@rtld-entry@@) -SECTIONS -{ - /* Read-only sections, merged into text segment: */ - . = @@rtld-base@@; - .reginfo : { *(.reginfo) } - .dynamic : { *(.dynamic) } - .dynstr : { *(.dynstr) } - .dynsym : { *(.dynsym) } - .hash : { *(.hash) } - .rel.text : { *(.rel.text) } - .rela.text : { *(.rela.text) } - .rel.data : { *(.rel.data) } - .rela.data : { *(.rela.data) } - .rel.rodata : { *(.rel.rodata) } - .rela.rodata : { *(.rela.rodata) } - .rel.got : { *(.rel.got) } - .rela.got : { *(.rela.got) } - .rel.ctors : { *(.rel.ctors) } - .rela.ctors : { *(.rela.ctors) } - .rel.dtors : { *(.rel.dtors) } - .rela.dtors : { *(.rela.dtors) } - .rel.init : { *(.rel.init) } - .rela.init : { *(.rela.init) } - .rel.fini : { *(.rel.fini) } - .rela.fini : { *(.rela.fini) } - .rel.bss : { *(.rel.bss) } - .rela.bss : { *(.rela.bss) } - .rel.plt : { *(.rel.plt) } - .rela.plt : { *(.rela.plt) } - .rodata : { *(.rodata) } - .rodata1 : { *(.rodata1) } - .init : { *(.init) } =0 - .text : - { - *(.text) - *(.stub) - /* .gnu.warning sections are handled specially by elf32.em. */ - *(.gnu.warning) - } =0 - .fini : { *(.fini) } =0 - /* Adjust the address for the data segment. We want to adjust up to - the same address within the page on the next page up. It would - be more correct to do this: - . = 0x10000000; - The current expression does not correctly handle the case of a - text segment ending precisely at the end of a page; it causes the - data segment to skip a page. The above expression does not have - this problem, but it will currently (2/95) cause BFD to allocate - a single segment, combining both text and data, for this case. - This will prevent the text segment from being shared among - multiple executions of the program; I think that is more - important than losing a page of the virtual address space (note - that no actual memory is lost; the page which is skipped can not - be referenced). */ - . += 0x10000; - .data : - { - *(.data) - CONSTRUCTORS - } - .data1 : { *(.data1) } - .ctors : { *(.ctors) } - .dtors : { *(.dtors) } - _gp = ALIGN(16) + 0x7ff0; - .got : - { - *(.got.plt) *(.got) - } - /* We want the small data sections together, so single-instruction offsets - can access them all, and initialized data all before uninitialized, so - we can shorten the on-disk segment size. */ - .sdata : { *(.sdata) } - .lit8 : { *(.lit8) } - .lit4 : { *(.lit4) } - .sbss : { *(.sbss) *(.scommon) } - .bss : - { - *(.dynbss) - *(.bss) - *(COMMON) - } - /* The normal linker scripts created by the binutils doesn't have the - symbols end and _end which breaks ld.so's dl-minimal.c. */ - _end = . ; - PROVIDE (end = .); - /* These are needed for ELF backends which have not yet been - converted to the new style linker. */ - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - /* DWARF debug sections. - Symbols in the .debug DWARF section are relative to the beginning of the - section so we begin .debug at 0. It's not clear yet what needs to happen - for the others. */ - .debug 0 : { *(.debug) } - .debug_srcinfo 0 : { *(.debug_srcinfo) } - .debug_aranges 0 : { *(.debug_aranges) } - .debug_pubnames 0 : { *(.debug_pubnames) } - .debug_sfnames 0 : { *(.debug_sfnames) } - .line 0 : { *(.line) } - /* These must appear regardless of . */ - .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) } - .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) } -} --- libc/sysdeps/mips/rtld-parms.mips Mon Jul 21 17:04:07 1997 +++ libc/sysdeps/mips/rtld-parms Fri Jul 13 10:54:55 2001 @@ -1,15 +0,0 @@ -ifndef rtld-wordsize -rtld-wordsize = 32 -endif -ifndef rtld-oformat -rtld-oformat = elf$(rtld-wordsize)-bigmips -endif -ifndef rtld-arch -rtld-arch = mips -endif -ifndef rtld-entry -rtld-entry = __start -endif -ifndef rtld-base -rtld-base = 0x0fb60000 + SIZEOF_HEADERS -endif