summaryrefslogtreecommitdiff
path: root/ldso
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2004-02-10 06:50:28 +0000
committerEric Andersen <andersen@codepoet.org>2004-02-10 06:50:28 +0000
commit499c27e1bd7015c48cff2c8f99237ab7dbf66a7b (patch)
tree3f2f07513818891b824a9d226195a37731cc40af /ldso
parentac1281c2785fd4487817690b270fc3f052280a54 (diff)
Fixup the definition of _dl_open, and move some bits back where they were,
till I properly finish the next step in my evil plan.
Diffstat (limited to 'ldso')
-rw-r--r--ldso/include/dl-syscall.h104
-rw-r--r--ldso/include/ld_syscall.h104
-rw-r--r--ldso/ldso/dl-elf.c4
-rw-r--r--ldso/ldso/ldso.c134
-rw-r--r--ldso/ldso/readelflib1.c4
5 files changed, 104 insertions, 246 deletions
diff --git a/ldso/include/dl-syscall.h b/ldso/include/dl-syscall.h
index 1e2ceccd6..344a93039 100644
--- a/ldso/include/dl-syscall.h
+++ b/ldso/include/dl-syscall.h
@@ -4,14 +4,21 @@
/* Pull in the arch specific syscall implementation */
#include <ld_syscalls.h>
/* For MAP_ANONYMOUS -- differs between platforms */
-#include <asm/mman.h>
+#include <asm/mman.h>
/* Pull in whatever this particular arch's kernel thinks the kernel version of
* struct stat should look like. It turns out that each arch has a different
* opinion on the subject, and different kernel revs use different names... */
#define kernel_stat stat
#include <bits/kernel_stat.h>
+#include <bits/kernel_types.h>
+/* _dl_open() parameters */
+#define O_RDONLY 0x0000
+#define O_WRONLY 01
+#define O_RDWR 02
+#define O_CREAT 0100
+
/* Encoding of the file mode. */
#define S_IFMT 0170000 /* These bits determine file type. */
@@ -25,7 +32,6 @@
#define S_IFSOCK 0140000 /* Socket. */
/* Protection bits. */
-
#define S_ISUID 04000 /* Set user ID on execution. */
#define S_ISGID 02000 /* Set group ID on execution. */
#define S_ISVTX 01000 /* Save swapped text after use (sticky). */
@@ -33,6 +39,19 @@
#define S_IWRITE 0200 /* Write by owner. */
#define S_IEXEC 0100 /* Execute by owner. */
+/* Stuff for _dl_mmap */
+#if 0
+#define MAP_FAILED ((void *) -1)
+#define _dl_mmap_check_error(X) (((void *)X) == MAP_FAILED)
+#else
+#ifndef _dl_MAX_ERRNO
+#define _dl_MAX_ERRNO 4096
+#endif
+#define _dl_mmap_check_error(__res) \
+ (((int)__res) < 0 && ((int)__res) >= -_dl_MAX_ERRNO)
+#endif
+
+
/* Here are the definitions for some syscalls that are used
by the dynamic linker. The idea is that we want to be able
@@ -40,79 +59,29 @@
we use our own version here. Note that we cannot assume any
dynamic linking at all, so we cannot return any error codes.
We just punt if there is an error. */
-
-
#define __NR__dl_exit __NR_exit
static inline _syscall1(void, _dl_exit, int, status);
-
#define __NR__dl_close __NR_close
static inline _syscall1(int, _dl_close, int, fd);
-
-#if defined(__powerpc__) || defined(__mips__) || defined(__sh__)
-/* PowerPC, MIPS and SuperH have a different calling convention for mmap(). */
-#define __NR__dl_mmap __NR_mmap
-static inline _syscall6(void *, _dl_mmap, void *, start, size_t, length,
- int, prot, int, flags, int, fd, off_t, offset);
-#else
-#define __NR__dl_mmap_real __NR_mmap
-static inline _syscall1(void *, _dl_mmap_real, unsigned long *, buffer);
-
-static inline void * _dl_mmap(void * addr, unsigned long size, int prot,
- int flags, int fd, unsigned long offset)
-{
- unsigned long buffer[6];
-
- buffer[0] = (unsigned long) addr;
- buffer[1] = (unsigned long) size;
- buffer[2] = (unsigned long) prot;
- buffer[3] = (unsigned long) flags;
- buffer[4] = (unsigned long) fd;
- buffer[5] = (unsigned long) offset;
- return (void *) _dl_mmap_real(buffer);
-}
-#endif
-
-#ifndef _dl_MAX_ERRNO
-#define _dl_MAX_ERRNO 4096
-#endif
-#define _dl_mmap_check_error(__res) \
- (((int)__res) < 0 && ((int)__res) >= -_dl_MAX_ERRNO)
-#ifndef MAP_ANONYMOUS
-#ifdef __sparc__
-#define MAP_ANONYMOUS 0x20
-#else
-#error MAP_ANONYMOUS not defined and suplementary value not known
-#endif
-#endif
-
-
#define __NR__dl_open __NR_open
-#define O_RDONLY 0x0000
-#define O_WRONLY 01
-#define O_RDWR 02
-#define O_CREAT 0100 /* not fcntl */
-static inline _syscall2(int, _dl_open, const char *, fn, int, flags);
+static inline _syscall3(int, _dl_open, const char *, fn, int, flags, __kernel_mode_t, mode);
#define __NR__dl_write __NR_write
-static inline _syscall3(unsigned long, _dl_write, int, fd,
+static inline _syscall3(unsigned long, _dl_write, int, fd,
const void *, buf, unsigned long, count);
-
#define __NR__dl_read __NR_read
-static inline _syscall3(unsigned long, _dl_read, int, fd,
+static inline _syscall3(unsigned long, _dl_read, int, fd,
const void *, buf, unsigned long, count);
#define __NR__dl_mprotect __NR_mprotect
static inline _syscall3(int, _dl_mprotect, const void *, addr, unsigned long, len, int, prot);
-
-
#define __NR__dl_stat __NR_stat
static inline _syscall2(int, _dl_stat, const char *, file_name, struct stat *, buf);
-
#define __NR__dl_munmap __NR_munmap
static inline _syscall2(int, _dl_munmap, void *, start, unsigned long, length);
@@ -134,5 +103,30 @@ static inline _syscall0(gid_t, _dl_getpid);
#define __NR__dl_readlink __NR_readlink
static inline _syscall3(int, _dl_readlink, const char *, path, char *, buf, size_t, bufsiz);
+#if defined(__powerpc__) || defined(__mips__) || defined(__sh__)
+/* PowerPC, MIPS and SuperH have a different calling convention for mmap(). */
+#define __NR__dl_mmap __NR_mmap
+static inline _syscall6(void *, _dl_mmap, void *, start, size_t, length,
+ int, prot, int, flags, int, fd, off_t, offset);
+#else
+#define __NR__dl_mmap_real __NR_mmap
+static inline _syscall1(void *, _dl_mmap_real, unsigned long *, buffer);
+
+static inline void * _dl_mmap(void * addr, unsigned long size, int prot,
+ int flags, int fd, unsigned long offset)
+{
+ unsigned long buffer[6];
+
+ buffer[0] = (unsigned long) addr;
+ buffer[1] = (unsigned long) size;
+ buffer[2] = (unsigned long) prot;
+ buffer[3] = (unsigned long) flags;
+ buffer[4] = (unsigned long) fd;
+ buffer[5] = (unsigned long) offset;
+ return (void *) _dl_mmap_real(buffer);
+}
+#endif
+
+
#endif /* _LD_SYSCALL_H_ */
diff --git a/ldso/include/ld_syscall.h b/ldso/include/ld_syscall.h
index 1e2ceccd6..344a93039 100644
--- a/ldso/include/ld_syscall.h
+++ b/ldso/include/ld_syscall.h
@@ -4,14 +4,21 @@
/* Pull in the arch specific syscall implementation */
#include <ld_syscalls.h>
/* For MAP_ANONYMOUS -- differs between platforms */
-#include <asm/mman.h>
+#include <asm/mman.h>
/* Pull in whatever this particular arch's kernel thinks the kernel version of
* struct stat should look like. It turns out that each arch has a different
* opinion on the subject, and different kernel revs use different names... */
#define kernel_stat stat
#include <bits/kernel_stat.h>
+#include <bits/kernel_types.h>
+/* _dl_open() parameters */
+#define O_RDONLY 0x0000
+#define O_WRONLY 01
+#define O_RDWR 02
+#define O_CREAT 0100
+
/* Encoding of the file mode. */
#define S_IFMT 0170000 /* These bits determine file type. */
@@ -25,7 +32,6 @@
#define S_IFSOCK 0140000 /* Socket. */
/* Protection bits. */
-
#define S_ISUID 04000 /* Set user ID on execution. */
#define S_ISGID 02000 /* Set group ID on execution. */
#define S_ISVTX 01000 /* Save swapped text after use (sticky). */
@@ -33,6 +39,19 @@
#define S_IWRITE 0200 /* Write by owner. */
#define S_IEXEC 0100 /* Execute by owner. */
+/* Stuff for _dl_mmap */
+#if 0
+#define MAP_FAILED ((void *) -1)
+#define _dl_mmap_check_error(X) (((void *)X) == MAP_FAILED)
+#else
+#ifndef _dl_MAX_ERRNO
+#define _dl_MAX_ERRNO 4096
+#endif
+#define _dl_mmap_check_error(__res) \
+ (((int)__res) < 0 && ((int)__res) >= -_dl_MAX_ERRNO)
+#endif
+
+
/* Here are the definitions for some syscalls that are used
by the dynamic linker. The idea is that we want to be able
@@ -40,79 +59,29 @@
we use our own version here. Note that we cannot assume any
dynamic linking at all, so we cannot return any error codes.
We just punt if there is an error. */
-
-
#define __NR__dl_exit __NR_exit
static inline _syscall1(void, _dl_exit, int, status);
-
#define __NR__dl_close __NR_close
static inline _syscall1(int, _dl_close, int, fd);
-
-#if defined(__powerpc__) || defined(__mips__) || defined(__sh__)
-/* PowerPC, MIPS and SuperH have a different calling convention for mmap(). */
-#define __NR__dl_mmap __NR_mmap
-static inline _syscall6(void *, _dl_mmap, void *, start, size_t, length,
- int, prot, int, flags, int, fd, off_t, offset);
-#else
-#define __NR__dl_mmap_real __NR_mmap
-static inline _syscall1(void *, _dl_mmap_real, unsigned long *, buffer);
-
-static inline void * _dl_mmap(void * addr, unsigned long size, int prot,
- int flags, int fd, unsigned long offset)
-{
- unsigned long buffer[6];
-
- buffer[0] = (unsigned long) addr;
- buffer[1] = (unsigned long) size;
- buffer[2] = (unsigned long) prot;
- buffer[3] = (unsigned long) flags;
- buffer[4] = (unsigned long) fd;
- buffer[5] = (unsigned long) offset;
- return (void *) _dl_mmap_real(buffer);
-}
-#endif
-
-#ifndef _dl_MAX_ERRNO
-#define _dl_MAX_ERRNO 4096
-#endif
-#define _dl_mmap_check_error(__res) \
- (((int)__res) < 0 && ((int)__res) >= -_dl_MAX_ERRNO)
-#ifndef MAP_ANONYMOUS
-#ifdef __sparc__
-#define MAP_ANONYMOUS 0x20
-#else
-#error MAP_ANONYMOUS not defined and suplementary value not known
-#endif
-#endif
-
-
#define __NR__dl_open __NR_open
-#define O_RDONLY 0x0000
-#define O_WRONLY 01
-#define O_RDWR 02
-#define O_CREAT 0100 /* not fcntl */
-static inline _syscall2(int, _dl_open, const char *, fn, int, flags);
+static inline _syscall3(int, _dl_open, const char *, fn, int, flags, __kernel_mode_t, mode);
#define __NR__dl_write __NR_write
-static inline _syscall3(unsigned long, _dl_write, int, fd,
+static inline _syscall3(unsigned long, _dl_write, int, fd,
const void *, buf, unsigned long, count);
-
#define __NR__dl_read __NR_read
-static inline _syscall3(unsigned long, _dl_read, int, fd,
+static inline _syscall3(unsigned long, _dl_read, int, fd,
const void *, buf, unsigned long, count);
#define __NR__dl_mprotect __NR_mprotect
static inline _syscall3(int, _dl_mprotect, const void *, addr, unsigned long, len, int, prot);
-
-
#define __NR__dl_stat __NR_stat
static inline _syscall2(int, _dl_stat, const char *, file_name, struct stat *, buf);
-
#define __NR__dl_munmap __NR_munmap
static inline _syscall2(int, _dl_munmap, void *, start, unsigned long, length);
@@ -134,5 +103,30 @@ static inline _syscall0(gid_t, _dl_getpid);
#define __NR__dl_readlink __NR_readlink
static inline _syscall3(int, _dl_readlink, const char *, path, char *, buf, size_t, bufsiz);
+#if defined(__powerpc__) || defined(__mips__) || defined(__sh__)
+/* PowerPC, MIPS and SuperH have a different calling convention for mmap(). */
+#define __NR__dl_mmap __NR_mmap
+static inline _syscall6(void *, _dl_mmap, void *, start, size_t, length,
+ int, prot, int, flags, int, fd, off_t, offset);
+#else
+#define __NR__dl_mmap_real __NR_mmap
+static inline _syscall1(void *, _dl_mmap_real, unsigned long *, buffer);
+
+static inline void * _dl_mmap(void * addr, unsigned long size, int prot,
+ int flags, int fd, unsigned long offset)
+{
+ unsigned long buffer[6];
+
+ buffer[0] = (unsigned long) addr;
+ buffer[1] = (unsigned long) size;
+ buffer[2] = (unsigned long) prot;
+ buffer[3] = (unsigned long) flags;
+ buffer[4] = (unsigned long) fd;
+ buffer[5] = (unsigned long) offset;
+ return (void *) _dl_mmap_real(buffer);
+}
+#endif
+
+
#endif /* _LD_SYSCALL_H_ */
diff --git a/ldso/ldso/dl-elf.c b/ldso/ldso/dl-elf.c
index ec324d6c4..cef44965e 100644
--- a/ldso/ldso/dl-elf.c
+++ b/ldso/ldso/dl-elf.c
@@ -51,7 +51,7 @@ int _dl_map_cache(void)
return 0;
if (_dl_stat(LDSO_CACHE, &st)
- || (fd = _dl_open(LDSO_CACHE, O_RDONLY)) < 0) {
+ || (fd = _dl_open(LDSO_CACHE, O_RDONLY, 0)) < 0) {
_dl_dprintf(2, "%s: can't open cache '%s'\n", _dl_progname, LDSO_CACHE);
_dl_cache_addr = (caddr_t) - 1; /* so we won't try again */
return -1;
@@ -429,7 +429,7 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure,
}
libaddr = 0;
- infile = _dl_open(libname, O_RDONLY);
+ infile = _dl_open(libname, O_RDONLY, 0);
if (infile < 0) {
#if 0
/*
diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c
index ae91e5068..064323bf7 100644
--- a/ldso/ldso/ldso.c
+++ b/ldso/ldso/ldso.c
@@ -314,7 +314,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *app_tpnt
filename[len1] = '.';
_dl_strcpy (&filename[len1+1], tmp1);
- _dl_debug_file= _dl_open (filename, O_WRONLY|O_CREAT, 0644);
+ _dl_debug_file= _dl_open(filename, O_WRONLY|O_CREAT, 0644);
if (_dl_debug_file<0)
{
_dl_debug_file = 2;
@@ -422,7 +422,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *app_tpnt
struct stat st;
char *preload;
if (!_dl_stat(LDSO_PRELOAD, &st) && st.st_size > 0) {
- if ((fd = _dl_open(LDSO_PRELOAD, O_RDONLY)) < 0) {
+ if ((fd = _dl_open(LDSO_PRELOAD, O_RDONLY, 0)) < 0) {
_dl_dprintf(2, "%s: can't open file '%s'\n",
_dl_progname, LDSO_PRELOAD);
} else {
@@ -767,135 +767,5 @@ static int _dl_suid_ok(void)
return 0;
}
-/* Minimal printf which handles only %s, %d, and %x */
-void _dl_dprintf(int fd, const char *fmt, ...)
-{
- int num;
- va_list args;
- char *start, *ptr, *string;
- static char *buf;
-
- buf = _dl_mmap((void *) 0, PAGE_SIZE, PROT_READ | PROT_WRITE,
- MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
- if (_dl_mmap_check_error(buf)) {
- _dl_write(fd, "mmap of a spare page failed!\n", 29);
- _dl_exit(20);
- }
-
- start = ptr = buf;
-
- if (!fmt)
- return;
-
- if (_dl_strlen(fmt) >= (PAGE_SIZE - 1)) {
- _dl_write(fd, "overflow\n", 11);
- _dl_exit(20);
- }
-
- _dl_strcpy(buf, fmt);
- va_start(args, fmt);
-
- while (start) {
- while (*ptr != '%' && *ptr) {
- ptr++;
- }
-
- if (*ptr == '%') {
- *ptr++ = '\0';
- _dl_write(fd, start, _dl_strlen(start));
-
- switch (*ptr++) {
- case 's':
- string = va_arg(args, char *);
-
- if (!string)
- _dl_write(fd, "(null)", 6);
- else
- _dl_write(fd, string, _dl_strlen(string));
- break;
-
- case 'i':
- case 'd':
- {
- char tmp[22];
- num = va_arg(args, int);
-
- string = _dl_simple_ltoa(tmp, num);
- _dl_write(fd, string, _dl_strlen(string));
- break;
- }
- case 'x':
- case 'X':
- {
- char tmp[22];
- num = va_arg(args, int);
-
- string = _dl_simple_ltoahex(tmp, num);
- _dl_write(fd, string, _dl_strlen(string));
- break;
- }
- default:
- _dl_write(fd, "(null)", 6);
- break;
- }
-
- start = ptr;
- } else {
- _dl_write(fd, start, _dl_strlen(start));
- start = NULL;
- }
- }
- _dl_munmap(buf, PAGE_SIZE);
- return;
-}
-
-char *_dl_strdup(const char *string)
-{
- char *retval;
- int len;
-
- len = _dl_strlen(string);
- retval = _dl_malloc(len + 1);
- _dl_strcpy(retval, string);
- return retval;
-}
-
-void *(*_dl_malloc_function) (size_t size) = NULL;
-void *_dl_malloc(int size)
-{
- void *retval;
-
-#if 0
-#ifdef __SUPPORT_LD_DEBUG_EARLY__
- _dl_dprintf(2, "malloc: request for %d bytes\n", size);
-#endif
-#endif
-
- if (_dl_malloc_function)
- return (*_dl_malloc_function) (size);
-
- if (_dl_malloc_addr - _dl_mmap_zero + size > PAGE_SIZE) {
-#ifdef __SUPPORT_LD_DEBUG_EARLY__
- _dl_dprintf(2, "malloc: mmapping more memory\n");
-#endif
- _dl_mmap_zero = _dl_malloc_addr = _dl_mmap((void *) 0, size,
- PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
- if (_dl_mmap_check_error(_dl_mmap_zero)) {
- _dl_dprintf(2, "%s: mmap of a spare page failed!\n", _dl_progname);
- _dl_exit(20);
- }
- }
- retval = _dl_malloc_addr;
- _dl_malloc_addr += size;
-
- /*
- * Align memory to 4 byte boundary. Some platforms require this, others
- * simply get better performance.
- */
- _dl_malloc_addr = (unsigned char *) (((unsigned long) _dl_malloc_addr + 3) & ~(3));
- return retval;
-}
-
-
#include "hash.c"
#include "readelflib1.c"
diff --git a/ldso/ldso/readelflib1.c b/ldso/ldso/readelflib1.c
index ec324d6c4..cef44965e 100644
--- a/ldso/ldso/readelflib1.c
+++ b/ldso/ldso/readelflib1.c
@@ -51,7 +51,7 @@ int _dl_map_cache(void)
return 0;
if (_dl_stat(LDSO_CACHE, &st)
- || (fd = _dl_open(LDSO_CACHE, O_RDONLY)) < 0) {
+ || (fd = _dl_open(LDSO_CACHE, O_RDONLY, 0)) < 0) {
_dl_dprintf(2, "%s: can't open cache '%s'\n", _dl_progname, LDSO_CACHE);
_dl_cache_addr = (caddr_t) - 1; /* so we won't try again */
return -1;
@@ -429,7 +429,7 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure,
}
libaddr = 0;
- infile = _dl_open(libname, O_RDONLY);
+ infile = _dl_open(libname, O_RDONLY, 0);
if (infile < 0) {
#if 0
/*