aboutsummaryrefslogtreecommitdiff
path: root/elf
diff options
context:
space:
mode:
Diffstat (limited to 'elf')
-rw-r--r--elf/Makefile30
-rw-r--r--elf/dl-load.c13
-rw-r--r--elf/dl-support.c4
-rw-r--r--elf/link.h4
-rw-r--r--elf/rtld.c12
5 files changed, 35 insertions, 28 deletions
diff --git a/elf/Makefile b/elf/Makefile
index 093fc09..739c230 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -35,6 +35,7 @@ elide-routines.os = $(dl-routines) dl-support enbl-secure
# ld.so uses those routines, plus some special stuff for being the program
# interpreter and operating independent of libc.
rtld-routines := rtld $(dl-routines) dl-sysdep dl-minimal
+ld-map = $(libc-map)
distribute = $(rtld-routines:=.c) dynamic-link.h do-rel.h dl-machine.h \
dl-hash.h soinit.c sofini.c ldd.sh.in ldd.bash.in eval.c \
genrtldtbl.awk atomicity.h dl-procinfo.h
@@ -88,22 +89,22 @@ $(objpfx)librtld.os: $(objpfx)dl-allobjs.os $(common-objpfx)libc_pic.a
# Do we need a linker script?
rtld-ldscript-in := $(firstword $(wildcard $(+sysdep_dirs:%=%/rtld-ldscript.in)))
-ifeq ($(versioning),yes)
-RTLD-VERSIONS = -Wl,--version-script=$(libc-map)
-endif
-
ifneq (,$(rtld-ldscript-in))
-LDFLAGS-rtld = -T $(objpfx)rtld-ldscript
+rtld-ldscript = $(objpfx)rtld-ldscript
+generated += rtld-ldscript
+
+LDFLAGS-rtld = -T $(rtld-ldscript)
+before-compile += $(rtld-ldscript)
-before-compile += $(objpfx)rtld-ldscript
rtld-parms = $(wildcard $(+sysdep_dirs:%=%/rtld-parms))
include $(rtld-parms)
-generated += rtld-ldscript
-$(objpfx)rtld-ldscript: $(rtld-ldscript-in) $(rtld-parms)
+
+$(rtld-ldscript): $(rtld-ldscript-in) $(rtld-parms)
sed -e 's#@@rtld-oformat@@#$(rtld-oformat)#' \
-e 's#@@rtld-arch@@#$(rtld-arch)#' \
-e 's#@@rtld-entry@@#$(rtld-entry)#' \
-e 's#@@rtld-base@@#$(rtld-base)#' $< >$@
+endif
$(objpfx)ld.so: $(objpfx)librtld.os $(objpfx)rtld-ldscript
$(rtld-link) -Wl,-soname=$(rtld-installed-name)
@@ -111,18 +112,9 @@ $(objpfx)ld.so: $(objpfx)librtld.os $(objpfx)rtld-ldscript
define rtld-link
$(LINK.o) -nostdlib -nostartfiles -shared -o $@ \
-Wl,-rpath=$(default-rpath) $(LDFLAGS-rtld) \
- $(filter-out $(objpfx)rtld-ldscript,$^) \
- $(RTLD-VERSIONS)
+ $(filter-out $(rtld-ldscript) $($(@F:.so=)-map),$^) \
+ $(load-map-file:%=-Wl,--version-script=%)
endef
-else
-$(objpfx)ld.so: $(objpfx)librtld.os
- $(rtld-link) -Wl,-soname=$(rtld-installed-name)
-
-define rtld-link
-$(LINK.o) -nostdlib -nostartfiles -shared -o $@ \
- -Wl,-rpath=$(default-rpath) $^ $(RTLD-VERSIONS)
-endef
-endif
# The dl code in the static libc needs a default library path.
CFLAGS-dl-support.c = -D'DEFAULT_RPATH="$(default-rpath)"'
diff --git a/elf/dl-load.c b/elf/dl-load.c
index 91b8c2a..73cafcc 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -1,5 +1,5 @@
/* Map in a shared object's segments from the file.
- Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+ Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -309,7 +309,7 @@ decompose_rpath (const char *rpath, size_t additional_room)
void
-_dl_init_paths (void)
+_dl_init_paths (const char *llp)
{
static const char *trusted_dirs[] =
{
@@ -325,10 +325,15 @@ _dl_init_paths (void)
variable. */
struct link_map *l;
- /* First determine how many elements the LD_LIBRARY_PATH contents has. */
- const char *llp = getenv ("LD_LIBRARY_PATH");
+ /* Number of elements in the library path. */
size_t nllp;
+ /* If the user has not specified a library path consider the environment
+ variable. */
+ if (llp == NULL)
+ llp = getenv ("LD_LIBRARY_PATH");
+
+ /* First determine how many elements the LD_LIBRARY_PATH contents has. */
if (llp != NULL && *llp != '\0')
{
/* Simply count the number of colons. */
diff --git a/elf/dl-support.c b/elf/dl-support.c
index c103d0e..5868656 100644
--- a/elf/dl-support.c
+++ b/elf/dl-support.c
@@ -1,5 +1,5 @@
/* Support for dynamic linking code in static libc.
- Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -58,7 +58,7 @@ non_dynamic_init (void)
/* Initialize the data structures for the search paths for shared
objects. */
- _dl_init_paths ();
+ _dl_init_paths (NULL);
#ifdef DL_PLATFORM_INIT
DL_PLATFORM_INIT;
diff --git a/elf/link.h b/elf/link.h
index c74e240..7f2dc67 100644
--- a/elf/link.h
+++ b/elf/link.h
@@ -1,5 +1,5 @@
/* Run-time dynamic linker data structures for loaded ELF shared objects.
- Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+ Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -443,7 +443,7 @@ extern void _dl_debug_state (void);
extern struct r_debug *_dl_debug_initialize (ElfW(Addr) ldbase);
/* Initialize the basic data structure for the search paths. */
-extern void _dl_init_paths (void);
+extern void _dl_init_paths (const char *library_path);
/* Gather the information needed to install the profiling tables and start
the timers. */
diff --git a/elf/rtld.c b/elf/rtld.c
index f1b45de..9529b9c 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -264,6 +264,7 @@ dl_main (const ElfW(Phdr) *phdr,
size_t file_size;
char *file;
int has_interp = 0;
+ const char *library_path = NULL; /* Overwrites LD_LIBRARY_PATH if given. */
/* Test whether we want to see the content of the auxiliary array passed
up from the kernel. */
@@ -343,6 +344,15 @@ dl_main (const ElfW(Phdr) *phdr,
--_dl_argc;
++_dl_argv;
}
+ else if (! strcmp (_dl_argv[1], "--library-path")
+ && _dl_argc > 2)
+ {
+ library_path = _dl_argv[2];
+
+ _dl_skip_args += 2;
+ _dl_argc -= 2;
+ _dl_argv += 2;
+ }
else
break;
@@ -484,7 +494,7 @@ of this helper program; chances are you did not intend to run this program.\n",
/* Initialize the data structures for the search paths for shared
objects. */
- _dl_init_paths ();
+ _dl_init_paths (library_path);
preloadlist = getenv ("LD_PRELOAD");
if (preloadlist)