diff --git a/ChangeLog b/ChangeLog index be289c27cc..667df43435 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +Sat Jun 15 18:13:43 1996 Roland McGrath + + * sysdeps/unix/sysv/linux/Dist: Add sys/klog.h. + + * elf/dl-open.c (_dl_open): Remove PARENT argument, pass null. + * elf/link.h: Update prototype. + * elf/dl-load.c (_dl_map_object): If dependents' DT_RPATHs don't find + NAME, try the DT_RPATH of the executable itself if dynamic. + * elf/dlopen.c (dlopen): Don't pass first arg to _dl_open. + + * elf/dl-load.c (_dl_map_object): Exit DT_RPATH checking loop when an + open succeeds. + + * Makerules (build-shlib): Give -L opts for each elt of $(rpath-link). + + * sysdeps/mach/hurd/Makefile (sysdep-LDFLAGS): Variable removed. + (rpath-link): Append to this instead. + Fri Jun 14 01:51:47 1996 Roland McGrath * version.c (banner): New static const variable, complete version diff --git a/Makerules b/Makerules index 4ea38edd34..cdb1bcb78c 100644 --- a/Makerules +++ b/Makerules @@ -486,7 +486,7 @@ define build-shlib $(LINK.o) -shared -o $@ $(sysdep-LDFLAGS) $(config-LDFLAGS) \ -Wl,-soname=lib$(libprefix)$(@F:lib%.so=%).so$($(@F)-version) \ $(LDFLAGS.so) $(LDFLAGS-$(@F:lib%.so=%).so) \ - -Wl,-rpath-link=$(common-objdir) \ + -L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link) \ -Wl,--whole-archive $^ $(no-whole-archive) \ $(LDLIBS-$(@F:lib%.so=%).so) endef diff --git a/elf/dl-load.c b/elf/dl-load.c index 48210731cc..f947bb8a93 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -469,13 +469,24 @@ _dl_map_object (struct link_map *loader, const char *name, int type) } fd = -1; - for (l = loader; l; l = l->l_loader) + + /* First try the DT_RPATH of the dependent object that caused NAME + to be loaded. Then that object's dependent, and on up. */ + for (l = loader; fd == -1 && l; l = l->l_loader) if (l && l->l_info[DT_RPATH]) trypath ((const char *) (l->l_addr + l->l_info[DT_STRTAB]->d_un.d_ptr + l->l_info[DT_RPATH]->d_un.d_val)); + /* If dynamically linked, try the DT_RPATH of the executable itself. */ + l = _dl_loaded; + if (fd == -1 && l && l->l_type != lt_loaded) + trypath ((const char *) (l->l_addr + + l->l_info[DT_STRTAB]->d_un.d_ptr + + l->l_info[DT_RPATH]->d_un.d_val)); + /* Try an environment variable (unless setuid). */ if (fd == -1 && ! _dl_secure) trypath (getenv ("LD_LIBRARY_PATH")); + /* Finally, try the default path. */ if (fd == -1) { extern const char *_dl_rpath; /* Set in rtld.c. */ diff --git a/elf/dl-open.c b/elf/dl-open.c index 8171837236..c24920f933 100644 --- a/elf/dl-open.c +++ b/elf/dl-open.c @@ -25,22 +25,15 @@ Cambridge, MA 02139, USA. */ size_t _dl_global_scope_alloc; struct link_map * -_dl_open (struct link_map *parent, const char *file, int mode) +_dl_open (const char *file, int mode) { struct link_map *new, *l; ElfW(Addr) init; struct r_debug *r; -#ifdef PIC - if (! parent) - /* If no particular dependent object caused this load, - then use the DT_RPATH of the executable itself. */ - parent = _dl_loaded; -#endif - /* Load the named object. */ - new = _dl_map_object (parent, file, lt_loaded); + new = _dl_map_object (NULL, file, lt_loaded); if (new->l_searchlist) /* It was already open. */ return new; diff --git a/elf/dlopen.c b/elf/dlopen.c index e261fcadd9..9de787dd68 100644 --- a/elf/dlopen.c +++ b/elf/dlopen.c @@ -28,7 +28,7 @@ dlopen (const char *file, int mode) void doit (void) { - new = _dl_open (_dl_loaded, file ?: "", mode); + new = _dl_open (file ?: "", mode); } return _dlerror_run (doit) ? NULL : new; diff --git a/elf/link.h b/elf/link.h index f43ec411f8..1e0104a4ea 100644 --- a/elf/link.h +++ b/elf/link.h @@ -205,11 +205,9 @@ extern void _dl_setup_hash (struct link_map *map); /* Open the shared object NAME, relocate it, and run its initializer if it - hasn't already been run. LOADER's DT_RPATH is used in searching for - NAME. MODE is as for `dlopen' (see ). If the object is - already opened, returns its existing map. */ -extern struct link_map *_dl_open (struct link_map *loader, - const char *name, int mode); + hasn't already been run. MODE is as for `dlopen' (see ). If + the object is already opened, returns its existing map. */ +extern struct link_map *_dl_open (const char *name, int mode); /* Close an object previously opened by _dl_open. */ extern void _dl_close (struct link_map *map); diff --git a/sysdeps/mach/hurd/Makefile b/sysdeps/mach/hurd/Makefile index f4b590a06b..bbee3faa65 100644 --- a/sysdeps/mach/hurd/Makefile +++ b/sysdeps/mach/hurd/Makefile @@ -104,7 +104,9 @@ endif # For the shared library, we don't need to do the linker script machination. # Instead, we specify the required libraries when building the shared object. LDLIBS-c.so = -lmachuser -lhurduser -sysdep-LDFLAGS += -Wl,-rpath-link=$(..)mach:$(..)hurd +ifndef objpfx +rpath-link += $(..)mach:$(..)hurd +endif endif # in-Makerules diff --git a/sysdeps/unix/sysv/linux/Dist b/sysdeps/unix/sysv/linux/Dist index affc75f8b0..9daf03a947 100644 --- a/sysdeps/unix/sysv/linux/Dist +++ b/sysdeps/unix/sysv/linux/Dist @@ -4,6 +4,7 @@ nfs/nfs.h sys/acct.h sys/io.h sys/kdaemon.h +sys/klog.h sys/module.h sys/mount.h sys/quota.h