diff options
| author | Ulrich Drepper <drepper@redhat.com> | 1997-07-26 02:33:30 +0000 |
|---|---|---|
| committer | Ulrich Drepper <drepper@redhat.com> | 1997-07-26 02:33:30 +0000 |
| commit | 0a54e4010fe0085cd36deaff9442a7e88de3270d (patch) | |
| tree | 050a1a47e17e5f1baa26a244524863884d8dc630 | |
| parent | 1522c3682ccf373e9d393ca73350be284fcf773b (diff) | |
| download | glibc-0a54e4010fe0085cd36deaff9442a7e88de3270d.tar.xz glibc-0a54e4010fe0085cd36deaff9442a7e88de3270d.zip | |
Update.cvs/libc-ud-970725
1997-07-26 04:14 Ulrich Drepper <drepper@cygnus.com>
* elf/Makefile (distribute): Add genrtldtbl.awk.
(before-compile): Add rtldtbl.h.
(GAWK): New variable.
(generated): Add trusted-dirs.h and rtldtbl.h.
($(objpfx)rtldtbl.h): New rule. File is needed by dl-load.c.
* elf/dl-load.c: Rewrite. Now use cache and look for shared
objects in machine dependent directories.
* elf/dl-object.c (_dl_new_object): Initialize l_rpath_dirs member.
* elf/dl-support.c: Rename function to non_dynamic_init and add
initialization for _dl_platform, _dl_platformlen, _dl_pagesize
and call to initializer for search path.
* elf/elf.h: Add AT_PLATFORM and AT_HWCAP.
* elf/genrtldtbl.awk: New file.
* elf/link.h: Add type definitions and declarations for search
path cache.
* elf/rtld.c: Add definitions of variables used for search path cache.
* sysdeps/generic/dl-sysdep.c: Let auxiliary vector initialize
_dl_platform. Initialize _dl_pagesize early and use this value.
* sysdeps/i386/dl-machine.h: Add code for _dl_platform handling.
* sysdeps/mach/hurd/dl-sysdep.c: Initialize _dl_pagesize.
* sysdeps/unix/sysv/linux/dl-sysdep.c: Use _dl_pagesize instead
of calling getpagesize.
* elf/dl-error.c (_dl_signal_error): Make message nicer.
* nss/libnss_files.map: Fix typo.
Reported by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>.
* sysdeps/generic/strsep.c: Optimize case where separator set contains
only one character.
* sysdeps/libm-ieee754/s_ccosh.c: Correct sign of result for real
== +-Inf.
* sysdeps/libm-ieee754/s_ccoshf.c: Likewise.
* sysdeps/libm-ieee754/s_ccoshl.c: Likewise.
1997-07-25 09:15 H.J. Lu <hjl@gnu.ai.mit.edu>
* sysdeps/sparc/udiv_qrnnd.S: Check PIC instead of __PIC__.
* sysdeps/unix/sysv/linux/sparc/__sigtrampoline.S: Likewise.
* sysdeps/unix/mips/sysdep.S: Likewise.
* sysdeps/unix/sysv/linux/mips/clone.S: Likewise.
* sysdeps/mips/bsd-_setjmp.S: Remove __PIC__ comment.
* sysdeps/mips/bsd-setjmp.S: Likewise.
* sysdeps/mips/dl-machine.h: Remove extra stuff.
* sysdeps/mips/mips64/dl-machine.h: Likewise.
1997-07-25 18:55 Philip Blundell <Philip.Blundell@pobox.com>
* sysdeps/standalone/arm/sysdep.c: New file.
1997-07-25 13:25 Philip Blundell <Philip.Blundell@pobox.com>
* aout/Makefile: New file.
* Makeconfig (binfmt-subdir): Assume a.out when not ELF.
* sysdeps/generic/machine-gmon.h: Add warning about limitations of
__builtin_return_address().
* sysdeps/arm/machine-gmon.h: New file, use assembly to avoid
above problem.
1997-07-25 16:24 H.J. Lu <hjl@gnu.ai.mit.edu>
* elf/dl-deps.c (_dl_map_object_deps): Fix a typo.
1997-07-22 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* math/libm-test.c (ccos_test, ccosh_test): Fix sign in some
tests.
1997-07-24 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sunrpc/clnt_udp.c (clntudp_call): Rename cu_wait from timeout to
not shadow the variable in the outer scope.
36 files changed, 790 insertions, 210 deletions
@@ -1,3 +1,82 @@ +1997-07-26 04:14 Ulrich Drepper <drepper@cygnus.com> + + * elf/Makefile (distribute): Add genrtldtbl.awk. + (before-compile): Add rtldtbl.h. + (GAWK): New variable. + (generated): Add trusted-dirs.h and rtldtbl.h. + ($(objpfx)rtldtbl.h): New rule. File is needed by dl-load.c. + * elf/dl-load.c: Rewrite. Now use cache and look for shared + objects in machine dependent directories. + * elf/dl-object.c (_dl_new_object): Initialize l_rpath_dirs member. + * elf/dl-support.c: Rename function to non_dynamic_init and add + initialization for _dl_platform, _dl_platformlen, _dl_pagesize + and call to initializer for search path. + * elf/elf.h: Add AT_PLATFORM and AT_HWCAP. + * elf/genrtldtbl.awk: New file. + * elf/link.h: Add type definitions and declarations for search + path cache. + * elf/rtld.c: Add definitions of variables used for search path cache. + * sysdeps/generic/dl-sysdep.c: Let auxiliary vector initialize + _dl_platform. Initialize _dl_pagesize early and use this value. + * sysdeps/i386/dl-machine.h: Add code for _dl_platform handling. + * sysdeps/mach/hurd/dl-sysdep.c: Initialize _dl_pagesize. + * sysdeps/unix/sysv/linux/dl-sysdep.c: Use _dl_pagesize instead + of calling getpagesize. + + * elf/dl-error.c (_dl_signal_error): Make message nicer. + + * nss/libnss_files.map: Fix typo. + Reported by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>. + + * sysdeps/generic/strsep.c: Optimize case where separator set contains + only one character. + + * sysdeps/libm-ieee754/s_ccosh.c: Correct sign of result for real + == +-Inf. + * sysdeps/libm-ieee754/s_ccoshf.c: Likewise. + * sysdeps/libm-ieee754/s_ccoshl.c: Likewise. + +1997-07-25 09:15 H.J. Lu <hjl@gnu.ai.mit.edu> + + * sysdeps/sparc/udiv_qrnnd.S: Check PIC instead of __PIC__. + * sysdeps/unix/sysv/linux/sparc/__sigtrampoline.S: Likewise. + * sysdeps/unix/mips/sysdep.S: Likewise. + * sysdeps/unix/sysv/linux/mips/clone.S: Likewise. + + * sysdeps/mips/bsd-_setjmp.S: Remove __PIC__ comment. + * sysdeps/mips/bsd-setjmp.S: Likewise. + + * sysdeps/mips/dl-machine.h: Remove extra stuff. + * sysdeps/mips/mips64/dl-machine.h: Likewise. + +1997-07-25 18:55 Philip Blundell <Philip.Blundell@pobox.com> + + * sysdeps/standalone/arm/sysdep.c: New file. + +1997-07-25 13:25 Philip Blundell <Philip.Blundell@pobox.com> + + * aout/Makefile: New file. + * Makeconfig (binfmt-subdir): Assume a.out when not ELF. + + * sysdeps/generic/machine-gmon.h: Add warning about limitations of + __builtin_return_address(). + * sysdeps/arm/machine-gmon.h: New file, use assembly to avoid + above problem. + +1997-07-25 16:24 H.J. Lu <hjl@gnu.ai.mit.edu> + + * elf/dl-deps.c (_dl_map_object_deps): Fix a typo. + +1997-07-22 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * math/libm-test.c (ccos_test, ccosh_test): Fix sign in some + tests. + +1997-07-24 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * sunrpc/clnt_udp.c (clntudp_call): Rename cu_wait from timeout to + not shadow the variable in the outer scope. + 1997-07-24 03:14 Ulrich Drepper <drepper@cygnus.com> * elf/dl-deps.c: Complete rewrite to handle DT_AUXILIARY correctly. diff --git a/Makeconfig b/Makeconfig index 0756d91905..4d6e2e6c54 100644 --- a/Makeconfig +++ b/Makeconfig @@ -88,7 +88,8 @@ include $(common-objpfx)config.make ifeq ($(elf),yes) binfmt-subdir = elf else -binfmt-subdir = +# This is probably better than nothing. +binfmt-subdir = aout endif # Complete path to sysdep dirs. diff --git a/db/hash/hash.c b/db/hash/hash.c index 08f2a7e3c8..0267da8c60 100644 --- a/db/hash/hash.c +++ b/db/hash/hash.c @@ -302,7 +302,9 @@ init_hash(hashp, file, info) if (file != NULL) { if (stat(file, &statbuf)) return (NULL); +#if defined _STATBUF_ST_BLKSIZE hashp->BSIZE = statbuf.st_blksize; +#endif hashp->BSHIFT = __hash_log2(hashp->BSIZE); } diff --git a/elf/Makefile b/elf/Makefile index 269a872969..e44711471b 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -35,15 +35,18 @@ elide-routines.so = $(dl-routines) dl-support enbl-secure # interpreter and operating independent of libc. rtld-routines := rtld $(dl-routines) dl-sysdep dl-minimal 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 + dl-hash.h soinit.c sofini.c ldd.sh.in ldd.bash.in eval.c \ + genrtldtbl.awk extra-libs = libdl extra-libs-others = $(extra-libs) libdl-routines := dlopen dlclose dlsym dlvsym dlerror dladdr libdl-map := libdl.map -before-compile = $(objpfx)trusted-dirs.h +before-compile = $(objpfx)trusted-dirs.h $(objpfx)rtldtbl.h +# We need GNU awk for the genrtldtbl.awk script. +GAWK = gawk all: # Make this the default target; it will be defined in Rules. @@ -51,7 +54,7 @@ include ../Makeconfig ifeq (yes,$(build-shared)) extra-objs = $(rtld-routines:=.so) soinit.so sofini.so eval.so -generated = librtld.so dl-allobjs.so +generated = librtld.so dl-allobjs.so trusted-dirs.h rtldtbl.h install-others = $(inst_slibdir)/$(rtld-installed-name) install-bin = ldd endif @@ -143,6 +146,10 @@ $(objpfx)trusted-dirs.h: Makefile echo " \"$$dir\","; \ done;) > $@T mv -f $@T $@ +$(objpfx)rtldtbl.h: Makefile + $(make-target-directory) + echo "$(default-rpath)" | $(GAWK) -f genrtldtbl.awk > $@T + mv -f $@T $@ CPPFLAGS-dl-load.c = -I$(objdir)/$(subdir) CFLAGS-dl-load.c += -Wno-uninitialized diff --git a/elf/dl-deps.c b/elf/dl-deps.c index 36f5ee0606..e990d6965b 100644 --- a/elf/dl-deps.c +++ b/elf/dl-deps.c @@ -57,12 +57,9 @@ openaux (void *a) -/* We use a very special kind of list to track the three kinds paths +/* We use a very special kind of list to track the two kinds paths through the list of loaded shared objects. We have to - - go through all objects in the correct order, which includes the - possible recursive loading of auxiliary objects and dependencies - - produce a flat list with unique members of all involved objects - produce a flat list of all shared objects. @@ -141,7 +138,7 @@ _dl_map_object_deps (struct link_map *map, { struct link_map *l = runp->map; - if (runp->done == 0 && (l->l_info[AUXTAG] || l->l_info[DT_NEEDED])) + if (l->l_info[AUXTAG] || l->l_info[DT_NEEDED]) { const char *strtab = ((void *) l->l_addr + l->l_info[DT_STRTAB]->d_un.d_ptr); @@ -371,6 +368,6 @@ _dl_map_object_deps (struct link_map *map, "cannot allocate symbol search list"); for (nlist = 0, runp = head; runp; runp = runp->dup) - map->l_searchlist[nlist++] = runp->map; + map->l_dupsearchlist[nlist++] = runp->map; } } diff --git a/elf/dl-error.c b/elf/dl-error.c index e2565bb348..7ee803ad9b 100644 --- a/elf/dl-error.c +++ b/elf/dl-error.c @@ -75,7 +75,7 @@ _dl_signal_error (int errcode, /* Lossage while resolving the program's own symbols is always fatal. */ extern char **_dl_argv; /* Set in rtld.c at startup. */ _dl_sysdep_fatal (_dl_argv[0] ?: "<program name unknown>", - ": error in loading shared libraries\n", + ": error in loading shared libraries", objname ?: "", objname ? ": " : "", errstring, errcode ? ": " : "", errcode ? strerror (errcode) : "", "\n", NULL); diff --git a/elf/dl-load.c b/elf/dl-load.c index 87859219f1..1301e73996 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -1,4 +1,4 @@ -/* _dl_map_object -- Map in a shared object's segments from the file. +/* Map in a shared object's segments from the file. Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -17,14 +17,15 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include <errno.h> +#include <fcntl.h> #include <link.h> -#include <sys/types.h> -#include <sys/mman.h> +#include <stdlib.h> #include <string.h> -#include <fcntl.h> #include <unistd.h> -#include <stdlib.h> -#include <errno.h> +#include <sys/mman.h> +#include <sys/stat.h> +#include <sys/types.h> #include "dynamic-link.h" @@ -90,6 +91,8 @@ ELF_PREFERRED_ADDRESS_DATA; size_t _dl_pagesize; +extern const char *_dl_platform; +extern size_t _dl_platformlen; /* Local version of `strdup' function. */ static inline char * @@ -105,6 +108,292 @@ local_strdup (const char *s) } +/* Implement cache for search path lookup. */ +#if 0 +/* This is how generated should look like. I'll remove this once I'm + sure everything works correctly. */ +static struct r_search_path_elem rtld_search_dir1 = + { "/lib/", 5, unknown, 0, unknown, NULL }; +static struct r_search_path_elem rtld_search_dir2 = + { "/usr/lib/", 9, unknown, 0, unknown, &r ld_search_dir1 }; + +static struct r_search_path_elem *rtld_search_dirs[] = +{ + &rtld_search_dir1, + &rtld_search_dir2, + NULL +}; + +static struct r_search_path_elem *all_dirs = &rtld_search_dir2; +#else +# include "rtldtbl.h" +#endif + +static size_t max_dirnamelen; + +static inline struct r_search_path_elem ** +fillin_rpath (char *rpath, struct r_search_path_elem **result, const char *sep, + const char **trusted) +{ + char *cp; + size_t nelems = 0; + + while ((cp = __strsep (&rpath, sep)) != NULL) + { + struct r_search_path_elem *dirp; + size_t len = strlen (cp); + /* Remove trailing slashes. */ + while (len > 1 && cp[len - 1] == '/') + --len; + + /* Make sure we don't use untrusted directories if we run SUID. */ + if (trusted != NULL) + { + const char **trun = trusted; + + /* All trusted directory must be complete name. */ + if (cp[0] != '/') + continue; + + while (*trun != NULL + && (memcmp (*trun, cp, len) != 0 || (*trun)[len] != '\0')) + ++trun; + + if (*trun == NULL) + /* It's no trusted directory, skip it. */ + continue; + } + + /* Now add one. */ + if (len > 0) + cp[len++] = '/'; + + /* See if this directory is already known. */ + for (dirp = all_dirs; dirp != NULL; dirp = dirp->next) + if (dirp->dirnamelen == len && strcmp (cp, dirp->dirname) == 0) + break; + + if (dirp != NULL) + { + /* It is available, see whether it's in our own list. */ + size_t cnt; + for (cnt = 0; cnt < nelems; ++cnt) + if (result[cnt] == dirp) + break; + + if (cnt == nelems) + result[nelems++] = dirp; + } + else + { + /* It's a new directory. Create an entry and add it. */ + dirp = (struct r_search_path_elem *) malloc (sizeof (*dirp)); + if (dirp == NULL) + _dl_signal_error (ENOMEM, NULL, + "cannot create cache for search path"); + + dirp->dirnamelen = len; + dirp->dirstatus = unknown; + + /* Add the name of the machine dependent directory if a machine + is defined. */ + if (_dl_platform != NULL) + { + char *tmp; + + dirp->machdirnamelen = len + _dl_platformlen + 1; + tmp = (char *) malloc (len + _dl_platformlen + 2); + if (tmp == NULL) + _dl_signal_error (ENOMEM, NULL, + "cannot create cache for search path"); + memcpy (tmp, cp, len); + memcpy (tmp + len, _dl_platform, _dl_platformlen); + tmp[len + _dl_platformlen] = '/'; + tmp[len + _dl_platformlen + 1] = '\0'; + + dirp->dirname = tmp; + dirp->machdirstatus = unknown; + + if (max_dirnamelen < dirp->machdirnamelen) + max_dirnamelen = dirp->machdirnamelen; + } + else + { + char *tmp; + + dirp->machdirnamelen = len; + dirp->machdirstatus = nonexisting; + + tmp = (char *) malloc (len + 1); + if (tmp == NULL) + _dl_signal_error (ENOMEM, NULL, + "cannot create cache for search path"); + memcpy (tmp, cp, len); + tmp[len] = '\0'; + + if (max_dirnamelen < dirp->dirnamelen) + max_dirnamelen = dirp->dirnamelen; + + dirp->dirname = tmp; + } + + dirp->next = all_dirs; + all_dirs = dirp; + + /* Put it in the result array. */ + result[nelems++] = dirp; + } + } + + /* Terminate the array. */ + result[nelems] = NULL; + + return result; +} + + +static struct r_search_path_elem ** +decompose_rpath (const char *rpath, size_t additional_room) +{ + /* |
