Tue Jun 11 19:13:04 1996 Richard Henderson <rth@tamu.edu>
authorRoland McGrath <roland@gnu.org>
Wed, 12 Jun 1996 01:54:21 +0000 (01:54 +0000)
committerRoland McGrath <roland@gnu.org>
Wed, 12 Jun 1996 01:54:21 +0000 (01:54 +0000)
* 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.

ChangeLog
elf/dl-close.c
elf/dl-lookup.c
elf/elf.h
elf/link.h
elf/rtld.c
shlib-versions
sysdeps/alpha/Makefile
sysdeps/generic/dl-sysdep.c
sysdeps/i386/dl-machine.h
sysdeps/m68k/dl-machine.h

index 21c2c2d..0eb13bd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
index 69fdefa..70d7ab4 100644 (file)
@@ -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>
 
index 5f1e6d0..bbccbc0 100644 (file)
@@ -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;
index f6d023d..0a4ec55 100644 (file)
--- a/elf/elf.h
+++ b/elf/elf.h
@@ -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.  */
 
index 89dfa20..6910445 100644 (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.  */
index 6647727..c9ddfb5 100644 (file)
@@ -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);
 }
 
 
index f6c2e8f..e043467 100644 (file)
 # 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
index 996c589..a9f12d1 100644 (file)
@@ -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
index 41d9cc9..9fab0f0 100644 (file)
@@ -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, ...)
 {
index a718792..c164d3d 100644 (file)
@@ -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\
index 415216b..ad3b6c3 100644 (file)
@@ -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