mirror of
git://sourceware.org/git/glibc.git
synced 2025-02-17 13:00:43 +08:00
Thu Oct 5 00:59:58 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* elf/rtld.c (dl_main): Grok --list flag. * sysdeps/mach/hurd/dl-sysdep.c (_dl_sysdep_start): Ignore -- args. * sysdeps/mach/hurd/dl-sysdep.c (_dl_sysdep_message): New function. * sysdeps/generic/dl-sysdep.c (_dl_sysdep_message): New function. * elf/link.h (_dl_sysdep_message): Declare it.
This commit is contained in:
parent
57aefafe56
commit
6a76c11515
@ -1,5 +1,14 @@
|
|||||||
|
Thu Oct 5 00:59:58 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
|
||||||
|
|
||||||
|
* elf/rtld.c (dl_main): Grok --list flag.
|
||||||
|
* sysdeps/mach/hurd/dl-sysdep.c (_dl_sysdep_start): Ignore -- args.
|
||||||
|
|
||||||
Wed Oct 4 00:21:03 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
|
Wed Oct 4 00:21:03 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
|
||||||
|
|
||||||
|
* sysdeps/mach/hurd/dl-sysdep.c (_dl_sysdep_message): New function.
|
||||||
|
* sysdeps/generic/dl-sysdep.c (_dl_sysdep_message): New function.
|
||||||
|
* elf/link.h (_dl_sysdep_message): Declare it.
|
||||||
|
|
||||||
* sysdeps/unix/Makefile ($(common-objpfx)ioctls): Remove NULL from
|
* sysdeps/unix/Makefile ($(common-objpfx)ioctls): Remove NULL from
|
||||||
the list.
|
the list.
|
||||||
|
|
||||||
|
@ -120,6 +120,11 @@ extern int _dl_zerofd;
|
|||||||
/* OS-dependent function to open the zero-fill device. */
|
/* OS-dependent function to open the zero-fill device. */
|
||||||
extern int _dl_sysdep_open_zero_fill (void); /* dl-sysdep.c */
|
extern int _dl_sysdep_open_zero_fill (void); /* dl-sysdep.c */
|
||||||
|
|
||||||
|
/* OS-dependent function to write a message on the standard output.
|
||||||
|
All arguments are `const char *'; args until a null pointer
|
||||||
|
are concatenated to form the message to print. */
|
||||||
|
extern void _dl_sysdep_message (const char *string, ...);
|
||||||
|
|
||||||
/* OS-dependent function to give a fatal error message and exit
|
/* OS-dependent function to give a fatal error message and exit
|
||||||
when the dynamic linker fails before the program is fully linked.
|
when the dynamic linker fails before the program is fully linked.
|
||||||
All arguments are `const char *'; args until a null pointer
|
All arguments are `const char *'; args until a null pointer
|
||||||
|
33
elf/rtld.c
33
elf/rtld.c
@ -22,6 +22,7 @@ Cambridge, MA 02139, USA. */
|
|||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include "../stdio/_itoa.h"
|
||||||
|
|
||||||
|
|
||||||
#ifdef RTLD_START
|
#ifdef RTLD_START
|
||||||
@ -113,6 +114,7 @@ dl_main (const Elf32_Phdr *phdr,
|
|||||||
struct link_map *l;
|
struct link_map *l;
|
||||||
const char *interpreter_name;
|
const char *interpreter_name;
|
||||||
int lazy;
|
int lazy;
|
||||||
|
int list_only = 0;
|
||||||
|
|
||||||
if (*user_entry == (Elf32_Addr) &_start)
|
if (*user_entry == (Elf32_Addr) &_start)
|
||||||
{
|
{
|
||||||
@ -133,7 +135,7 @@ dl_main (const Elf32_Phdr *phdr,
|
|||||||
installing it. */
|
installing it. */
|
||||||
if (_dl_argc < 2)
|
if (_dl_argc < 2)
|
||||||
_dl_sysdep_fatal ("\
|
_dl_sysdep_fatal ("\
|
||||||
Usage: ld.so EXECUTABLE-FILE [ARGS-FOR-PROGRAM...]\n\
|
Usage: ld.so [--list] EXECUTABLE-FILE [ARGS-FOR-PROGRAM...]\n\
|
||||||
You have invoked `ld.so', the helper program for shared library executables.\n\
|
You have invoked `ld.so', the helper program for shared library executables.\n\
|
||||||
This program usually lives in the file `/lib/ld.so', and special directives\n\
|
This program usually lives in the file `/lib/ld.so', and special directives\n\
|
||||||
in executable files using ELF shared libraries tell the system's program\n\
|
in executable files using ELF shared libraries tell the system's program\n\
|
||||||
@ -147,10 +149,21 @@ file you run. This is mostly of use for maintainers to test new versions\n\
|
|||||||
of this helper program; chances are you did not intend to run this program.\n",
|
of this helper program; chances are you did not intend to run this program.\n",
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
++_dl_skip_args;
|
|
||||||
interpreter_name = _dl_argv[0];
|
interpreter_name = _dl_argv[0];
|
||||||
|
|
||||||
|
if (! strcmp (_dl_argv[1], "--list"))
|
||||||
|
{
|
||||||
|
list_only = 1;
|
||||||
|
|
||||||
|
++_dl_skip_args;
|
||||||
--_dl_argc;
|
--_dl_argc;
|
||||||
++_dl_argv;
|
++_dl_argv;
|
||||||
|
}
|
||||||
|
|
||||||
|
++_dl_skip_args;
|
||||||
|
--_dl_argc;
|
||||||
|
++_dl_argv;
|
||||||
|
|
||||||
l = _dl_map_object (NULL, _dl_argv[0]);
|
l = _dl_map_object (NULL, _dl_argv[0]);
|
||||||
phdr = l->l_phdr;
|
phdr = l->l_phdr;
|
||||||
phent = l->l_phnum;
|
phent = l->l_phnum;
|
||||||
@ -265,6 +278,22 @@ of this helper program; chances are you did not intend to run this program.\n",
|
|||||||
dl_r_debug.r_version = 1 /* R_DEBUG_VERSION XXX */;
|
dl_r_debug.r_version = 1 /* R_DEBUG_VERSION XXX */;
|
||||||
dl_r_debug.r_map = _dl_loaded;
|
dl_r_debug.r_map = _dl_loaded;
|
||||||
dl_r_debug.r_brk = (Elf32_Addr) &_dl_r_debug_state;
|
dl_r_debug.r_brk = (Elf32_Addr) &_dl_r_debug_state;
|
||||||
|
|
||||||
|
if (list_only)
|
||||||
|
{
|
||||||
|
for (l = _dl_loaded->l_next; l; l = l->l_next)
|
||||||
|
{
|
||||||
|
char buf[20], *bp;
|
||||||
|
buf[sizeof buf - 1] = '\0';
|
||||||
|
bp = _itoa (l->l_addr, &buf[sizeof buf - 1], 16, 0);
|
||||||
|
while (&buf[sizeof buf - 1] - bp < sizeof l->l_addr * 2)
|
||||||
|
*--bp = '0';
|
||||||
|
_dl_sysdep_message ("\t", l->l_libname, " => ", l->l_name,
|
||||||
|
" (0x", bp, ")\n", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
_exit (0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
const char *errstring;
|
const char *errstring;
|
||||||
const char *errobj;
|
const char *errobj;
|
||||||
|
@ -104,3 +104,19 @@ _dl_sysdep_fatal (const char *msg, ...)
|
|||||||
|
|
||||||
_exit (127);
|
_exit (127);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
_dl_sysdep_message (const char *msg, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start (ap, msg);
|
||||||
|
do
|
||||||
|
{
|
||||||
|
size_t len = strlen (msg);
|
||||||
|
write (STDOUT_FILENO, msg, len);
|
||||||
|
msg = va_arg (ap, const char *);
|
||||||
|
} while (msg);
|
||||||
|
va_end (ap);
|
||||||
|
}
|
||||||
|
@ -116,7 +116,7 @@ unfmh(); /* XXX */
|
|||||||
for example "-/lib/libc.so=123" says that the contents of
|
for example "-/lib/libc.so=123" says that the contents of
|
||||||
/lib/libc.so are found in a memory object whose port name
|
/lib/libc.so are found in a memory object whose port name
|
||||||
in our task is 123. */
|
in our task is 123. */
|
||||||
while (_dl_argc > 2 && _dl_argv[1][0] == '-')
|
while (_dl_argc > 2 && _dl_argv[1][0] == '-' && _dl_argv[1][1] != '-')
|
||||||
{
|
{
|
||||||
char *lastslash, *memobjname, *p;
|
char *lastslash, *memobjname, *p;
|
||||||
struct link_map *l;
|
struct link_map *l;
|
||||||
@ -227,6 +227,28 @@ _dl_sysdep_fatal (const char *msg, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
_dl_sysdep_message (const char *msg, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start (ap, msg);
|
||||||
|
do
|
||||||
|
{
|
||||||
|
size_t len = strlen (msg);
|
||||||
|
mach_msg_type_number_t nwrote;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (__io_write (_hurd_init_dtable[1], msg, len, -1, &nwrote))
|
||||||
|
break;
|
||||||
|
len -= nwrote;
|
||||||
|
msg += nwrote;
|
||||||
|
} while (nwrote > 0);
|
||||||
|
msg = va_arg (ap, const char *);
|
||||||
|
} while (msg);
|
||||||
|
va_end (ap);
|
||||||
|
}
|
||||||
|
|
||||||
/* Minimal open/close/mmap implementation sufficient for initial loading of
|
/* Minimal open/close/mmap implementation sufficient for initial loading of
|
||||||
shared libraries. These are weak definitions so that when the
|
shared libraries. These are weak definitions so that when the
|
||||||
dynamic linker re-relocates itself to be user-visible (for -ldl),
|
dynamic linker re-relocates itself to be user-visible (for -ldl),
|
||||||
|
Loading…
Reference in New Issue
Block a user