aboutsummaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/alpha/Makefile8
-rw-r--r--sysdeps/generic/dl-sysdep.c23
-rw-r--r--sysdeps/i386/dl-machine.h2
-rw-r--r--sysdeps/m68k/dl-machine.h2
4 files changed, 24 insertions, 11 deletions
diff --git a/sysdeps/alpha/Makefile b/sysdeps/alpha/Makefile
index 996c589c85..a9f12d1396 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 41d9cc98f9..9fab0f0922 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 a718792e0a..c164d3d47f 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 415216b14a..ad3b6c3590 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