cf4aca11b5
_rtld_bind_start must save and restore the condition codes. Varargs functions (like, say, printf()) depend on the state of cr1 to determine whether they need to store floating point registers in the save area. Without this, the first call to any particular varargs function will fail if floating point values were passed. |
||
---|---|---|
.. | ||
arch | ||
debug.c | ||
debug.h | ||
headers.c | ||
load.c | ||
Makefile | ||
malloc.c | ||
map_object.c | ||
paths.c | ||
README | ||
reloc.c | ||
rtld.c | ||
rtld.h | ||
rtldenv.h | ||
search.c | ||
symbol.c | ||
sysident.h | ||
xmalloc.c | ||
xprintf.c |
$NetBSD: README,v 1.6 1999/08/20 21:12:47 christos Exp $ BUGS/PROBLEMS: * rtld.c around line 184: #iffdef __alpha__ /* XXX XXX XXX */ _rtld_objself.pltgot = NULL; #endif It's a workaround for a linker bug, and will go away when the linker is fixed. * Formerly, _DYNAMIC was _GLOBAL_OFFSET_TABLE_[0], but that isn't true with newer snapshots of gas/binutils (at least on the Alpha), which support multiple GOTs. That's what the OLD_GOT #ifdefs are about. * The method used to relocate ld.so is shoddy and fragile. Currently it's something like: alpha, powerpc: (1) assembly code relocates RELATIVE relocations in the GOT (on some ports, all relative relocations; this will probably have to be #ifdef'd in reloc.c), assuming that everything in the GOT is a RELATIVE relocation. (2) C code relocates the rest of the loader, excluding those RELATIVE relocations already done (via an ... iffy heuristic). i386, m68k, sparc: (1) C code relocates RELATIVE relocations in _rtld_init() carefully so that it does not touch any globals. (2) C code relocates the rest of the loader, excluding those RELATIVE relocations already done (via an ... iffy heuristic). mips: (1) loads ld.elf_so at 0, so no relocating is necessary. Something better (like that the glibc ELF ld.so does) should be done eventually, where a single set of C code is compiled twice, once for normal use, and once to be used to relocate the shared linker. No relocations should be processed in assembly language. * On the Alpha, this code Really needs to be checked to be sure that it doesn't make calls that could use FP, while doing lazy binding. TO DO: * Support for other platforms * Support for coexistance of 32-bit and 64-bit ELF on platforms that can do that. * Possible support for ldd (standalone operation) and program loading a la the glibc shared loader. * Support for relocating ld.elf_so on mips