* Clean up the mips dynamic linker
@ 2001-07-13 1:24 H . J . Lu
2001-07-13 9:26 ` Ralf Baechle
0 siblings, 1 reply; 13+ messages in thread
From: H . J . Lu @ 2001-07-13 1:24 UTC (permalink / raw)
To: linux-mips; +Cc: GNU C Library
Here is a patch to cleanup the mips dynamic linker. It fixes 2 things:
1. We have been handling MAP_BASE_ADDR right for a long time. In
the MIPS SVR4 ABI, DT_MIPS_MAP_BASE_ADDR holds the virtual address of
the segment. According to the ABI, it is only used for
The dynamic linker relocates the global offset table by first adding
the difference between the base where the shared object is loaded
and the value of dyamic tag DT_MIPS_MAP_BASE_ADDR to all local
global offset table entries.
In glibc, this difference is stored in the l_addr field in link_map. We
have adjusted it in elf_machine_got_rel ():
/* Relocate GOT. */
static inline void
elf_machine_got_rel (struct link_map *map, int lazy)
{
ElfW(Addr) *got;
ElfW(Sym) *sym;
int i, n, symidx;
got = (ElfW(Addr) *) D_PTR (map, l_info[DT_PLTGOT]);
n = map->l_info[DT_MIPS (LOCAL_GOTNO)]->d_un.d_val;
/* The dynamic linker's local got entries have already been relocated. */
if (map != &_dl_rtld_map)
{
/* got[0] is reserved. got[1] is also reserved for the dynamic object
generated by gnu ld. Skip these reserved entries from relocation. */
i = (got[1] & ELF_MIPS_GNU_GOT1_MASK)? 2 : 1;
/* Add the run-time displacement to all local got entries if
needed. */
if (__builtin_expect (map->l_addr != 0, 0))
{
while (i < n)
got[i++] += map->l_addr;
}
}
In fact, DT_MIPS_MAP_BASE_ADDR is the same as the p_addr field of the
first loadable segment in the program header. I think it is included
in the MIPS ABI to give the dynamic linker easy access to it.
I have tested DSOs with none-zero DT_MIPS_MAP_BASE_ADDR. It works
fine. I think it is safe to remove MAP_BASE_ADDR and old binaries
will work with the new glibc. If someone thinks I am wrong, please
send me a testcase to show it.
2. The existing mips dynamic linker resolves GOT at the wrong time. It
does it in elf_machine_got_rel called from elf_machine_runtime_setup.
It doesn't work with Jakub's prelinking work. I think it should be
done in elf_dynamic_do_rel. I introduced a new macro,
ELF_MACHINE_RESOLVE_GOT, to do it.
I also clean up a little bit to follow lazy binding.
Any comments?
Thanks.
H.J.
-----
2001-07-12 H.J. Lu <hjl@gnu.org>
* elf/do-rel.h (ELF_MACHINE_RESOLVE_GOT): New.
(elf_dynamic_do_rel): Call ELF_MACHINE_RESOLVE_GOT.
* sysdeps/mips/dl-machine.h (MAP_BASE_ADDR): Removed.
(ELF_MACHINE_RESOLVE_GOT): Defined as elf_machine_resolve_got.
(elf_machine_resolve_got): New fucntion to resolve GOT.
(elf_machine_got_rel): Only do GOT relocation.
* sysdeps/mips/rtld-ldscript.in: Removed.
* sysdeps/mips/rtld-parms: Likewise.
* sysdeps/mips/mips64/rtld-parms: Likewise.
* sysdeps/mips/mipsel/rtld-parms: Likewise.
--- libc/elf/do-rel.h.mips Sat Jul 7 16:44:45 2001
+++ libc/elf/do-rel.h Thu Jul 12 17:07:47 2001
@@ -30,6 +30,12 @@
# define VERSYMIDX(sym) (DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (sym))
#endif
+/* Some machine, like mips, needs to resolve GOT. */
+
+#ifndef ELF_MACHINE_RESOLVE_GOT
+#define ELF_MACHINE_RESOLVE_GOT(map,lazy)
+#endif
+
/* Perform the relocations in MAP on the running program image as specified
by RELTAG, SZTAG. If LAZY is nonzero, this is the first pass on PLT
relocations; they should be set up to call _dl_runtime_resolve, rather
@@ -42,6 +48,8 @@ elf_dynamic_do_rel (struct link_map *map
{
const ElfW(Rel) *r = (const void *) reladdr;
const ElfW(Rel) *end = (const void *) (reladdr + relsize);
+
+ ELF_MACHINE_RESOLVE_GOT (map, lazy);
if (lazy)
{
--- libc/sysdeps/mips/dl-machine.h.mips Sat Jul 7 16:46:05 2001
+++ libc/sysdeps/mips/dl-machine.h Thu Jul 12 17:36:11 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,76 +540,31 @@ elf_machine_lazy_rel (struct link_map *m
/* Do nothing. */
}
-/* Relocate GOT. */
+#ifndef RTLD_BOOTSTRAP
+#define ELF_MACHINE_RESOLVE_GOT(map,lazy) \
+ elf_machine_resolve_got ((map), (lazy))
+
+/* Resolve GOT. */
static inline void
-elf_machine_got_rel (struct link_map *map, int lazy)
+elf_machine_resolve_got (struct link_map *map, int lazy)
{
ElfW(Addr) *got;
ElfW(Sym) *sym;
- 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) \
- ({ \
- 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, 0); \
- break; \
- } \
- /* Fall through. */ \
- } \
- case 0: \
- value = _dl_lookup_symbol (strtab + sym->st_name, map, &ref, \
- scope, R_MIPS_REL32, 0); \
- } \
- \
- (ref)? value + ref->st_value: 0; \
- })
-#endif /* RTLD_BOOTSTRAP */
+ int i, n;
+ const ElfW(Half) *const version;
- got = (ElfW(Addr) *) D_PTR (map, l_info[DT_PLTGOT]);
-
- n = map->l_info[DT_MIPS (LOCAL_GOTNO)]->d_un.d_val;
- /* The dynamic linker's local got entries have already been relocated. */
- if (map != &_dl_rtld_map)
- {
- /* got[0] is reserved. got[1] is also reserved for the dynamic object
- generated by gnu ld. Skip these reserved entries from relocation. */
- i = (got[1] & ELF_MIPS_GNU_GOT1_MASK)? 2 : 1;
+ if (map->l_info[VERSYMIDX (DT_VERSYM)])
+ version = (const void *) D_PTR (map, l_info[VERSYMIDX (DT_VERSYM)]);
+ else
+ version = NULL;
- /* Add the run-time displacement to all local got entries if
- needed. */
- if (__builtin_expect (map->l_addr != 0, 0))
- {
- while (i < n)
- got[i++] += map->l_addr;
- }
- }
+ got = (ElfW(Addr) *) D_PTR (map, l_info[DT_PLTGOT]);
/* Handle global got entries. */
- got += n;
+ got += map->l_info[DT_MIPS (LOCAL_GOTNO)]->d_un.d_val;
/* Keep track of the symbol index. */
- symidx = map->l_info[DT_MIPS (GOTSYM)]->d_un.d_val;
- sym = (ElfW(Sym) *) D_PTR (map, l_info[DT_SYMTAB]) + symidx;
+ sym = (ElfW(Sym) *) D_PTR (map, l_info[DT_SYMTAB])
+ + map->l_info[DT_MIPS (GOTSYM)]->d_un.d_val;
i = (map->l_info[DT_MIPS (SYMTABNO)]->d_un.d_val
- map->l_info[DT_MIPS (GOTSYM)]->d_un.d_val);
@@ -635,17 +573,25 @@ elf_machine_got_rel (struct link_map *ma
{
if (sym->st_shndx == SHN_UNDEF)
{
- if (ELFW(ST_TYPE) (sym->st_info) == STT_FUNC
- && sym->st_value && lazy)
- *got = sym->st_value + map->l_addr;
+ if (ELFW(ST_TYPE) (sym->st_info) == STT_FUNC)
+ {
+ if (sym->st_value == 0)
+ {
+ if (!lazy)
+ *got = RESOLVE (&sym, version, R_MIPS_REL32);
+ }
+ else if (*got == sym->st_value)
+ *got += map->l_addr;
+ else
+ *got = sym->st_value + map->l_addr;
+ }
else
- *got = RESOLVE_GOTSYM (sym, symidx);
+ *got = RESOLVE (&sym, version, R_MIPS_REL32);
}
else if (sym->st_shndx == SHN_COMMON)
- *got = RESOLVE_GOTSYM (sym, symidx);
+ *got = RESOLVE (&sym, version, R_MIPS_REL32);
else if (ELFW(ST_TYPE) (sym->st_info) == STT_FUNC
- && *got != sym->st_value
- && lazy)
+ && *got != sym->st_value)
*got += map->l_addr;
else if (ELFW(ST_TYPE) (sym->st_info) == STT_SECTION)
{
@@ -653,17 +599,40 @@ elf_machine_got_rel (struct link_map *ma
*got += map->l_addr;
}
else
- *got = RESOLVE_GOTSYM (sym, symidx);
+ *got = RESOLVE (&sym, version, R_MIPS_REL32);
++got;
++sym;
- ++symidx;
}
+}
-#undef RESOLVE_GOTSYM
+/* Relocate GOT. */
+static inline void
+elf_machine_got_rel (struct link_map *map, int lazy)
+{
+ ElfW(Addr) *got;
+ int i, n;
+
+ got = (ElfW(Addr) *) D_PTR (map, l_info[DT_PLTGOT]);
+
+ n = map->l_info[DT_MIPS (LOCAL_GOTNO)]->d_un.d_val;
+ /* The dynamic linker's local got entries have already been relocated. */
+ if (map != &_dl_rtld_map)
+ {
+ /* got[0] is reserved. got[1] is also reserved for the dynamic object
+ generated by gnu ld. Skip these reserved entries from relocation. */
+ i = (got[1] & ELF_MIPS_GNU_GOT1_MASK)? 2 : 1;
- return;
+ /* Add the run-time displacement to all local got entries if
+ needed. */
+ if (__builtin_expect (map->l_addr != 0, 0))
+ {
+ while (i < n)
+ got[i++] += map->l_addr;
+ }
+ }
}
+#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 Thu Jul 12 17:49: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 Thu Jul 12 17:49: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 Thu Jul 12 17:49: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 Thu Jul 12 17:49: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
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Clean up the mips dynamic linker
2001-07-13 1:24 Clean up the mips dynamic linker H . J . Lu
@ 2001-07-13 9:26 ` Ralf Baechle
2001-07-13 16:06 ` Ulrich Drepper
` (2 more replies)
0 siblings, 3 replies; 13+ messages in thread
From: Ralf Baechle @ 2001-07-13 9:26 UTC (permalink / raw)
To: H . J . Lu; +Cc: linux-mips, GNU C Library
On Thu, Jul 12, 2001 at 06:24:02PM -0700, H . J . Lu wrote:
> In fact, DT_MIPS_MAP_BASE_ADDR is the same as the p_addr field of the
> first loadable segment in the program header. I think it is included
> in the MIPS ABI to give the dynamic linker easy access to it.
Afair there is no requirement for loadable segments to be sorted so you'd
have to go through all the program header table to find the one with the
lowest address which isn't necessarily the first segment.
As the ABI doesn't give any guarantee that the lowest address in the segment
table is the value of DT_MIPS_BASE_ADDR I just tried to find a binary on
my IRIX boxen that violates this rule but I didn't find any. So please,
go ahead.
> I have tested DSOs with none-zero DT_MIPS_MAP_BASE_ADDR. It works
> fine. I think it is safe to remove MAP_BASE_ADDR and old binaries
> will work with the new glibc. If someone thinks I am wrong, please
> send me a testcase to show it.
Ralf
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Clean up the mips dynamic linker
2001-07-13 9:26 ` Ralf Baechle
@ 2001-07-13 16:06 ` Ulrich Drepper
2001-07-13 18:07 ` Andreas Jaeger
2001-07-13 18:10 ` H . J . Lu
2001-07-13 18:14 ` H . J . Lu
2001-07-13 19:25 ` Roland McGrath
2 siblings, 2 replies; 13+ messages in thread
From: Ulrich Drepper @ 2001-07-13 16:06 UTC (permalink / raw)
To: Ralf Baechle; +Cc: H . J . Lu, linux-mips, GNU C Library
Ralf Baechle <ralf@oss.sgi.com> writes:
> So please, go ahead.
So you say the patch is OK from your POV?
--
---------------. ,-. 1325 Chesapeake Terrace
Ulrich Drepper \ ,-------------------' \ Sunnyvale, CA 94089 USA
Red Hat `--' drepper at redhat.com `------------------------
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Clean up the mips dynamic linker
2001-07-13 16:06 ` Ulrich Drepper
@ 2001-07-13 18:07 ` Andreas Jaeger
2001-07-13 18:07 ` Andreas Jaeger
2001-07-13 18:17 ` H . J . Lu
2001-07-13 18:10 ` H . J . Lu
1 sibling, 2 replies; 13+ messages in thread
From: Andreas Jaeger @ 2001-07-13 18:07 UTC (permalink / raw)
To: Ulrich Drepper; +Cc: Ralf Baechle, H . J . Lu, linux-mips, GNU C Library
Ulrich Drepper <drepper@redhat.com> writes:
> Ralf Baechle <ralf@oss.sgi.com> writes:
>
>> So please, go ahead.
>
> So you say the patch is OK from your POV?
Just for the record, I also think it's ok - but will not apply it
since it depends on patches for generic code.
Andreas
--
Andreas Jaeger
SuSE Labs aj@suse.de
private aj@arthur.inka.de
http://www.suse.de/~aj
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Clean up the mips dynamic linker
2001-07-13 18:07 ` Andreas Jaeger
@ 2001-07-13 18:07 ` Andreas Jaeger
2001-07-13 18:17 ` H . J . Lu
1 sibling, 0 replies; 13+ messages in thread
From: Andreas Jaeger @ 2001-07-13 18:07 UTC (permalink / raw)
To: Ulrich Drepper; +Cc: Ralf Baechle, H . J . Lu, linux-mips, GNU C Library
Ulrich Drepper <drepper@redhat.com> writes:
> Ralf Baechle <ralf@oss.sgi.com> writes:
>
>> So please, go ahead.
>
> So you say the patch is OK from your POV?
Just for the record, I also think it's ok - but will not apply it
since it depends on patches for generic code.
Andreas
--
Andreas Jaeger
SuSE Labs aj@suse.de
private aj@arthur.inka.de
http://www.suse.de/~aj
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Clean up the mips dynamic linker
2001-07-13 16:06 ` Ulrich Drepper
2001-07-13 18:07 ` Andreas Jaeger
@ 2001-07-13 18:10 ` H . J . Lu
2001-07-16 6:35 ` Ulrich Drepper
2001-07-16 22:27 ` Ulrich Drepper
1 sibling, 2 replies; 13+ messages in thread
From: H . J . Lu @ 2001-07-13 18:10 UTC (permalink / raw)
To: Ulrich Drepper; +Cc: Ralf Baechle, linux-mips, GNU C Library
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
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Clean up the mips dynamic linker
2001-07-13 9:26 ` Ralf Baechle
2001-07-13 16:06 ` Ulrich Drepper
@ 2001-07-13 18:14 ` H . J . Lu
2001-07-13 19:25 ` Roland McGrath
2 siblings, 0 replies; 13+ messages in thread
From: H . J . Lu @ 2001-07-13 18:14 UTC (permalink / raw)
To: Ralf Baechle; +Cc: linux-mips, GNU C Library
On Fri, Jul 13, 2001 at 11:26:36AM +0200, Ralf Baechle wrote:
> On Thu, Jul 12, 2001 at 06:24:02PM -0700, H . J . Lu wrote:
>
> > In fact, DT_MIPS_MAP_BASE_ADDR is the same as the p_addr field of the
> > first loadable segment in the program header. I think it is included
> > in the MIPS ABI to give the dynamic linker easy access to it.
>
> Afair there is no requirement for loadable segments to be sorted so you'd
> have to go through all the program header table to find the one with the
> lowest address which isn't necessarily the first segment.
>
> As the ABI doesn't give any guarantee that the lowest address in the segment
> table is the value of DT_MIPS_BASE_ADDR I just tried to find a binary on
> my IRIX boxen that violates this rule but I didn't find any. So please,
> go ahead.
It doesn't matter. DT_MIPS_BASE_ADDR is the "Base Address" in the gABI.
glibc has to get the "Base Address" right. Otherwise, it won't work
correctly for all cases. It is not mips specific.
H.J.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Clean up the mips dynamic linker
2001-07-13 18:07 ` Andreas Jaeger
2001-07-13 18:07 ` Andreas Jaeger
@ 2001-07-13 18:17 ` H . J . Lu
1 sibling, 0 replies; 13+ messages in thread
From: H . J . Lu @ 2001-07-13 18:17 UTC (permalink / raw)
To: Andreas Jaeger; +Cc: Ulrich Drepper, Ralf Baechle, linux-mips, GNU C Library
On Fri, Jul 13, 2001 at 08:07:40PM +0200, Andreas Jaeger wrote:
> Ulrich Drepper <drepper@redhat.com> writes:
>
> > Ralf Baechle <ralf@oss.sgi.com> writes:
> >
> >> So please, go ahead.
> >
> > So you say the patch is OK from your POV?
>
> Just for the record, I also think it's ok - but will not apply it
> since it depends on patches for generic code.
Please ignore my first patch, which is wrong. The second one is ok
which doesn't touch generic code.
H.J.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Clean up the mips dynamic linker
2001-07-13 9:26 ` Ralf Baechle
2001-07-13 16:06 ` Ulrich Drepper
2001-07-13 18:14 ` H . J . Lu
@ 2001-07-13 19:25 ` Roland McGrath
2001-07-13 19:31 ` H . J . Lu
2 siblings, 1 reply; 13+ messages in thread
From: Roland McGrath @ 2001-07-13 19:25 UTC (permalink / raw)
To: Ralf Baechle; +Cc: H . J . Lu, linux-mips, GNU C Library
> Afair there is no requirement for loadable segments to be sorted
PT_LOAD entries appear in ascending order, sorted on the p_vaddr member.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Clean up the mips dynamic linker
2001-07-13 19:25 ` Roland McGrath
@ 2001-07-13 19:31 ` H . J . Lu
0 siblings, 0 replies; 13+ messages in thread
From: H . J . Lu @ 2001-07-13 19:31 UTC (permalink / raw)
To: Roland McGrath; +Cc: Ralf Baechle, linux-mips, GNU C Library
On Fri, Jul 13, 2001 at 03:25:00PM -0400, Roland McGrath wrote:
> > Afair there is no requirement for loadable segments to be sorted
>
> PT_LOAD entries appear in ascending order, sorted on the p_vaddr member.
Thanks. I missed that one. In any case, glibc has been right on mips
for a long time. We just don't need that specical treatmeant for
DT_MIPS_BASE_ADDRESS.
H.J.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Clean up the mips dynamic linker
2001-07-13 18:10 ` H . J . Lu
@ 2001-07-16 6:35 ` Ulrich Drepper
2001-07-16 13:57 ` H . J . Lu
2001-07-16 22:27 ` Ulrich Drepper
1 sibling, 1 reply; 13+ messages in thread
From: Ulrich Drepper @ 2001-07-16 6:35 UTC (permalink / raw)
To: H . J . Lu; +Cc: Ralf Baechle, linux-mips, GNU C Library
"H . J . Lu" <hjl@lucon.org> writes:
> 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.
Is this the complete patch? Nothing needed from the other patches?
--
---------------. ,-. 1325 Chesapeake Terrace
Ulrich Drepper \ ,-------------------' \ Sunnyvale, CA 94089 USA
Red Hat `--' drepper at redhat.com `------------------------
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Clean up the mips dynamic linker
2001-07-16 6:35 ` Ulrich Drepper
@ 2001-07-16 13:57 ` H . J . Lu
0 siblings, 0 replies; 13+ messages in thread
From: H . J . Lu @ 2001-07-16 13:57 UTC (permalink / raw)
To: Ulrich Drepper; +Cc: Ralf Baechle, linux-mips, GNU C Library
On Sun, Jul 15, 2001 at 11:35:04PM -0700, Ulrich Drepper wrote:
> "H . J . Lu" <hjl@lucon.org> writes:
>
> > 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.
>
> Is this the complete patch? Nothing needed from the other patches?
>
Yes, it is complete. Tested on Linux/mipsel.
H.J.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Clean up the mips dynamic linker
2001-07-13 18:10 ` H . J . Lu
2001-07-16 6:35 ` Ulrich Drepper
@ 2001-07-16 22:27 ` Ulrich Drepper
1 sibling, 0 replies; 13+ messages in thread
From: Ulrich Drepper @ 2001-07-16 22:27 UTC (permalink / raw)
To: H . J . Lu; +Cc: Ralf Baechle, linux-mips, GNU C Library
"H . J . Lu" <hjl@lucon.org> writes:
> My last patch was not ok :-(. Somehow, make didn't rebuild. In this
> patch, I rewrote RESOLVE_GOTSYM with RESOLVE to help prelink.
Applied now. Thanks,
--
---------------. ,-. 1325 Chesapeake Terrace
Ulrich Drepper \ ,-------------------' \ Sunnyvale, CA 94089 USA
Red Hat `--' drepper at redhat.com `------------------------
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2001-07-16 22:31 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2001-07-13 1:24 Clean up the mips dynamic linker H . J . Lu
2001-07-13 9:26 ` Ralf Baechle
2001-07-13 16:06 ` Ulrich Drepper
2001-07-13 18:07 ` Andreas Jaeger
2001-07-13 18:07 ` Andreas Jaeger
2001-07-13 18:17 ` H . J . Lu
2001-07-13 18:10 ` H . J . Lu
2001-07-16 6:35 ` Ulrich Drepper
2001-07-16 13:57 ` H . J . Lu
2001-07-16 22:27 ` Ulrich Drepper
2001-07-13 18:14 ` H . J . Lu
2001-07-13 19:25 ` Roland McGrath
2001-07-13 19:31 ` H . J . Lu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox