1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-08 17:42:12 +03:00

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.
This commit is contained in:
Roland McGrath
1996-06-12 01:54:21 +00:00
parent 6e86a7c21b
commit 8d6468d0c8
11 changed files with 64 additions and 17 deletions

View File

@@ -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> 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. * Makerules (elfobjdir): Use $(objdir) if set, even in elf subdir.

View File

@@ -20,6 +20,7 @@ Cambridge, MA 02139, USA. */
#include <link.h> #include <link.h>
#include <dlfcn.h> #include <dlfcn.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/mman.h> #include <sys/mman.h>

View File

@@ -20,6 +20,7 @@ Cambridge, MA 02139, USA. */
#include <stddef.h> #include <stddef.h>
#include <link.h> #include <link.h>
#include <assert.h> #include <assert.h>
#include <string.h>
/* This is the hashing function specified by the ELF ABI. */ /* 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 ElfW(Sym) *symtab;
const char *strtab; const char *strtab;
ElfW(Word) symidx; ElfW(Symndx) symidx;
map = (*scope)->l_searchlist[i]; map = (*scope)->l_searchlist[i];
@@ -149,8 +150,8 @@ _dl_lookup_symbol (const char *undef_name, const ElfW(Sym) **ref,
void void
_dl_setup_hash (struct link_map *map) _dl_setup_hash (struct link_map *map)
{ {
ElfW(Word) *hash = (void *) map->l_addr + map->l_info[DT_HASH]->d_un.d_ptr; ElfW(Symndx) *hash = (void *)(map->l_addr + map->l_info[DT_HASH]->d_un.d_ptr);
ElfW(Word) nchain; ElfW(Symndx) nchain;
map->l_nbuckets = *hash++; map->l_nbuckets = *hash++;
nchain = *hash++; nchain = *hash++;
map->l_buckets = hash; map->l_buckets = hash;

View File

@@ -54,6 +54,10 @@ typedef unsigned int Elf64_Off __attribute__ ((mode (DI)));
typedef unsigned int Elf32_Section __attribute__ ((mode (HI))); typedef unsigned int Elf32_Section __attribute__ ((mode (HI)));
typedef unsigned int Elf64_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. */ /* The ELF file header. This appears at the start of every ELF file. */

View File

@@ -110,8 +110,8 @@ struct link_map
struct link_map *l_loader; struct link_map *l_loader;
/* Symbol hash table. */ /* Symbol hash table. */
ElfW(Word) l_nbuckets; ElfW(Symndx) l_nbuckets;
const ElfW(Word) *l_buckets, *l_chain; const ElfW(Symndx) *l_buckets, *l_chain;
unsigned int l_opencount; /* Reference count for dlopen/dlclose. */ unsigned int l_opencount; /* Reference count for dlopen/dlclose. */
enum /* Where this object came from. */ enum /* Where this object came from. */

View File

@@ -101,7 +101,7 @@ _dl_start (void *arg)
file access. It will call `dl_main' (below) to do all the real work 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 of the dynamic linker, and then unwind our frame and run the user
entry point on the same stack we entered on. */ entry point on the same stack we entered on. */
return _dl_sysdep_start (&arg, &dl_main); return _dl_sysdep_start (arg, &dl_main);
} }

View File

@@ -11,10 +11,12 @@
# The interface to -lm depends only on cpu, not on operating system. # The interface to -lm depends only on cpu, not on operating system.
i?86-*-* libm=6 i?86-*-* libm=6
m68k-*-* libm=6 m68k-*-* libm=6
alpha-*-* libm=6
# We provide libc.so.6 for Linux kernel versions 1.3.95 and later. # We provide libc.so.6 for Linux kernel versions 1.3.95 and later.
i?86-*-linux* libc=6 i?86-*-linux* libc=6
m68k-*-linux* libc=6 m68k-*-linux* libc=6
alpha-*-linux* libc=6
# libmachuser.so.1 corresponds to mach/*.defs as of Utah's UK22 release. # libmachuser.so.1 corresponds to mach/*.defs as of Utah's UK22 release.
*-*-gnu* libmachuser=1 *-*-gnu* libmachuser=1

View File

@@ -28,4 +28,12 @@ ifeq ($(subdir),gnulib)
routines = $(divrem) routines = $(divrem)
endif # gnulib 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 divrem := divl divlu divq divqu reml remlu remq remqu

View File

@@ -22,6 +22,9 @@ Cambridge, MA 02139, USA. */
#include <fcntl.h> #include <fcntl.h>
#include <link.h> #include <link.h>
#include <unistd.h> #include <unistd.h>
#include <stdarg.h>
#include <string.h>
extern int _dl_argc; extern int _dl_argc;
extern char **_dl_argv; extern char **_dl_argv;
@@ -29,21 +32,21 @@ extern char **_environ;
extern void _start (void); extern void _start (void);
extern int _dl_secure; extern int _dl_secure;
Elf32_Addr ElfW(Addr)
_dl_sysdep_start (void **start_argptr, _dl_sysdep_start (void **start_argptr,
void (*dl_main) (const Elf32_Phdr *phdr, Elf32_Word phnum, void (*dl_main) (const ElfW(Phdr) *phdr, ElfW(Word) phnum,
Elf32_Addr *user_entry)) ElfW(Addr) *user_entry))
{ {
const Elf32_Phdr *phdr; const ElfW(Phdr) *phdr;
Elf32_Word phnum; ElfW(Word) phnum;
Elf32_Addr user_entry; ElfW(Addr) user_entry;
Elf32_auxv_t *av; ElfW(auxv_t) *av;
uid_t uid, euid; uid_t uid, euid;
gid_t gid, egid; gid_t gid, egid;
unsigned int seen; unsigned int seen;
user_entry = (Elf32_Addr) &_start; user_entry = (ElfW(Addr)) &_start;
_dl_argc = *(int *) start_argptr; _dl_argc = *(long *) start_argptr;
_dl_argv = (char **) start_argptr + 1; _dl_argv = (char **) start_argptr + 1;
_environ = &_dl_argv[_dl_argc + 1]; _environ = &_dl_argv[_dl_argc + 1];
start_argptr = (void **) _environ; start_argptr = (void **) _environ;
@@ -112,8 +115,6 @@ _dl_sysdep_open_zero_fill (void)
return __open ("/dev/zero", O_RDONLY); return __open ("/dev/zero", O_RDONLY);
} }
#include <stdarg.h>
void void
_dl_sysdep_fatal (const char *msg, ...) _dl_sysdep_fatal (const char *msg, ...)
{ {

View File

@@ -206,7 +206,9 @@ _dl_runtime_resolve:
.globl _start\n\ .globl _start\n\
.globl _dl_start_user\n\ .globl _dl_start_user\n\
_start:\n\ _start:\n\
pushl %esp\n\
call _dl_start\n\ call _dl_start\n\
popl %ebx\n\
_dl_start_user:\n\ _dl_start_user:\n\
# Save the user entry point address in %edi.\n\ # Save the user entry point address in %edi.\n\
movl %eax, %edi\n\ movl %eax, %edi\n\

View File

@@ -234,7 +234,9 @@ _dl_runtime_resolve:
.globl _start .globl _start
.globl _dl_start_user .globl _dl_start_user
_start: _start:
move.l %sp, -(%sp)
jbsr _dl_start jbsr _dl_start
addq.l #4, %sp
_dl_start_user: _dl_start_user:
| Save the user entry point address in %a4. | Save the user entry point address in %a4.
move.l %d0, %a4 move.l %d0, %a4