* 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 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.
#include <link.h>
#include <dlfcn.h>
#include <stdlib.h>
+#include <string.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <stddef.h>
#include <link.h>
#include <assert.h>
+#include <string.h>
/* This is the hashing function specified by the ELF ABI. */
{
const ElfW(Sym) *symtab;
const char *strtab;
- ElfW(Word) symidx;
+ ElfW(Symndx) symidx;
map = (*scope)->l_searchlist[i];
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;
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. */
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. */
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);
}
# 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
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
#include <fcntl.h>
#include <link.h>
#include <unistd.h>
+#include <stdarg.h>
+#include <string.h>
+
extern int _dl_argc;
extern char **_dl_argv;
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;
return __open ("/dev/zero", O_RDONLY);
}
-#include <stdarg.h>
-
void
_dl_sysdep_fatal (const char *msg, ...)
{
.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\
.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