diff options
-rw-r--r-- | ChangeLog | 26 | ||||
-rw-r--r-- | elf/dl-close.c | 1 | ||||
-rw-r--r-- | elf/dl-lookup.c | 7 | ||||
-rw-r--r-- | elf/elf.h | 4 | ||||
-rw-r--r-- | elf/link.h | 4 | ||||
-rw-r--r-- | elf/rtld.c | 2 | ||||
-rw-r--r-- | shlib-versions | 2 | ||||
-rw-r--r-- | sysdeps/alpha/Makefile | 8 | ||||
-rw-r--r-- | sysdeps/generic/dl-sysdep.c | 23 | ||||
-rw-r--r-- | sysdeps/i386/dl-machine.h | 2 | ||||
-rw-r--r-- | sysdeps/m68k/dl-machine.h | 2 |
11 files changed, 64 insertions, 17 deletions
@@ -1,3 +1,29 @@ +Tue Jun 11 19:13:04 1996 Richard Henderson <rth@tamu.edu> + + * elf/dl-close.c: Include <string.h> for memcpy. + * elf/dl-lookup.c: Same. + + * elf/elf.h: Add Elfxx_Symndx for symbol indices. + * elf/dl-lookup.c (_dl_lookup_symbol): Use it. + (_dl_setup_hash): Use it. + * elf/link.h (struct link_map): Use it. + + * elf/rtld.c (_dl_start): Don't rely on pointer-to-first-arg hack + for getting the argc/argv/envp block. Instead, make it the argument. + sysdeps/i386/dl-machine.h (RTLD_START): Do that. + sysdeps/m68k/dl-machine.h (RTLD_START): Same. + + * shlib-versions: Add version numbers for alpha-linux. To avoid + user confusion, make them the same as i386-linux. + + * sysdeps/alpha/Makefile [subdir elf]: Add -mno-fp-regs to + sysdep-CFLAGS so that _dl_runtime_resolve doesn't have to save them. + Add -mbuild-constants to CFLAGS-rtld.c to that we can bootstrap + without using literal data. + + * sysdeps/generic/dl-sysdep.c: Include <string.h> for memcpy. + Finish Elf32 -> ElfW migration. + Tue Jun 11 15:09:15 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu> * Makerules (elfobjdir): Use $(objdir) if set, even in elf subdir. diff --git a/elf/dl-close.c b/elf/dl-close.c index 69fdefa..70d7ab4 100644 --- a/elf/dl-close.c +++ b/elf/dl-close.c @@ -20,6 +20,7 @@ Cambridge, MA 02139, USA. */ #include <link.h> #include <dlfcn.h> #include <stdlib.h> +#include <string.h> #include <sys/types.h> #include <sys/mman.h> diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c index 5f1e6d0..bbccbc0 100644 --- a/elf/dl-lookup.c +++ b/elf/dl-lookup.c @@ -20,6 +20,7 @@ Cambridge, MA 02139, USA. */ #include <stddef.h> #include <link.h> #include <assert.h> +#include <string.h> /* This is the hashing function specified by the ELF ABI. */ @@ -70,7 +71,7 @@ _dl_lookup_symbol (const char *undef_name, const ElfW(Sym) **ref, { const ElfW(Sym) *symtab; const char *strtab; - ElfW(Word) symidx; + ElfW(Symndx) symidx; map = (*scope)->l_searchlist[i]; @@ -149,8 +150,8 @@ _dl_lookup_symbol (const char *undef_name, const ElfW(Sym) **ref, void _dl_setup_hash (struct link_map *map) { - ElfW(Word) *hash = (void *) map->l_addr + map->l_info[DT_HASH]->d_un.d_ptr; - ElfW(Word) nchain; + ElfW(Symndx) *hash = (void *)(map->l_addr + map->l_info[DT_HASH]->d_un.d_ptr); + ElfW(Symndx) nchain; map->l_nbuckets = *hash++; nchain = *hash++; map->l_buckets = hash; @@ -54,6 +54,10 @@ typedef unsigned int Elf64_Off __attribute__ ((mode (DI))); typedef unsigned int Elf32_Section __attribute__ ((mode (HI))); typedef unsigned int Elf64_Section __attribute__ ((mode (HI))); +/* Type of symbol indices. */ +typedef unsigned int Elf32_Symndx __attribute__ ((mode (SI))); +typedef unsigned int Elf64_Symndx __attribute__ ((mode (DI))); + /* The ELF file header. This appears at the start of every ELF file. */ @@ -110,8 +110,8 @@ struct link_map struct link_map *l_loader; /* Symbol hash table. */ - ElfW(Word) l_nbuckets; - const ElfW(Word) *l_buckets, *l_chain; + ElfW(Symndx) l_nbuckets; + const ElfW(Symndx) *l_buckets, *l_chain; unsigned int l_opencount; /* Reference count for dlopen/dlclose. */ enum /* Where this object came from. */ @@ -101,7 +101,7 @@ _dl_start (void *arg) file access. It will call `dl_main' (below) to do all the real work of the dynamic linker, and then unwind our frame and run the user entry point on the same stack we entered on. */ - return _dl_sysdep_start (&arg, &dl_main); + return _dl_sysdep_start (arg, &dl_main); } diff --git a/shlib-versions b/shlib-versions index f6c2e8f..e043467 100644 --- a/shlib-versions +++ b/shlib-versions @@ -11,10 +11,12 @@ # The interface to -lm depends only on cpu, not on operating system. i?86-*-* libm=6 m68k-*-* libm=6 +alpha-*-* libm=6 # We provide libc.so.6 for Linux kernel versions 1.3.95 and later. i?86-*-linux* libc=6 m68k-*-linux* libc=6 +alpha-*-linux* libc=6 # libmachuser.so.1 corresponds to mach/*.defs as of Utah's UK22 release. *-*-gnu* libmachuser=1 diff --git a/sysdeps/alpha/Makefile b/sysdeps/alpha/Makefile index 996c589..a9f12d1 100644 --- a/sysdeps/alpha/Makefile +++ b/sysdeps/alpha/Makefile @@ -28,4 +28,12 @@ ifeq ($(subdir),gnulib) routines = $(divrem) endif # gnulib +ifeq ($(subdir),elf) +# The ld.so code cannot use literals until it self-relocates. +CFLAGS-rtld.c = -mbuild-constants +# The rest of ld.so shouldn't use FP regs for block moves so +# that the lazy link trampoline doesn't have to save them. +sysdep-CFLAGS += -mno-fp-regs +endif + divrem := divl divlu divq divqu reml remlu remq remqu diff --git a/sysdeps/generic/dl-sysdep.c b/sysdeps/generic/dl-sysdep.c index 41d9cc9..9fab0f0 100644 --- a/sysdeps/generic/dl-sysdep.c +++ b/sysdeps/generic/dl-sysdep.c @@ -22,6 +22,9 @@ Cambridge, MA 02139, USA. */ #include <fcntl.h> #include <link.h> #include <unistd.h> +#include <stdarg.h> +#include <string.h> + extern int _dl_argc; extern char **_dl_argv; @@ -29,21 +32,21 @@ extern char **_environ; extern void _start (void); extern int _dl_secure; -Elf32_Addr +ElfW(Addr) _dl_sysdep_start (void **start_argptr, - void (*dl_main) (const Elf32_Phdr *phdr, Elf32_Word phnum, - Elf32_Addr *user_entry)) + void (*dl_main) (const ElfW(Phdr) *phdr, ElfW(Word) phnum, + ElfW(Addr) *user_entry)) { - const Elf32_Phdr *phdr; - Elf32_Word phnum; - Elf32_Addr user_entry; - Elf32_auxv_t *av; + const ElfW(Phdr) *phdr; + ElfW(Word) phnum; + ElfW(Addr) user_entry; + ElfW(auxv_t) *av; uid_t uid, euid; gid_t gid, egid; unsigned int seen; - user_entry = (Elf32_Addr) &_start; - _dl_argc = *(int *) start_argptr; + user_entry = (ElfW(Addr)) &_start; + _dl_argc = *(long *) start_argptr; _dl_argv = (char **) start_argptr + 1; _environ = &_dl_argv[_dl_argc + 1]; start_argptr = (void **) _environ; @@ -112,8 +115,6 @@ _dl_sysdep_open_zero_fill (void) return __open ("/dev/zero", O_RDONLY); } -#include <stdarg.h> - void _dl_sysdep_fatal (const char *msg, ...) { diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h index a718792..c164d3d 100644 --- a/sysdeps/i386/dl-machine.h +++ b/sysdeps/i386/dl-machine.h @@ -206,7 +206,9 @@ _dl_runtime_resolve: .globl _start\n\ .globl _dl_start_user\n\ _start:\n\ + pushl %esp\n\ call _dl_start\n\ + popl %ebx\n\ _dl_start_user:\n\ # Save the user entry point address in %edi.\n\ movl %eax, %edi\n\ diff --git a/sysdeps/m68k/dl-machine.h b/sysdeps/m68k/dl-machine.h index 415216b..ad3b6c3 100644 --- a/sysdeps/m68k/dl-machine.h +++ b/sysdeps/m68k/dl-machine.h @@ -234,7 +234,9 @@ _dl_runtime_resolve: .globl _start .globl _dl_start_user _start: + move.l %sp, -(%sp) jbsr _dl_start + addq.l #4, %sp _dl_start_user: | Save the user entry point address in %a4. move.l %d0, %a4 |