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:
26
ChangeLog
26
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>
|
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.
|
||||||
|
@@ -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>
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
@@ -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. */
|
||||||
|
|
||||||
|
@@ -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. */
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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, ...)
|
||||||
{
|
{
|
||||||
|
@@ -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\
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user