aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1997-07-26 02:33:30 +0000
committerUlrich Drepper <drepper@redhat.com>1997-07-26 02:33:30 +0000
commit0a54e4010fe0085cd36deaff9442a7e88de3270d (patch)
tree050a1a47e17e5f1baa26a244524863884d8dc630
parent1522c3682ccf373e9d393ca73350be284fcf773b (diff)
downloadglibc-0a54e4010fe0085cd36deaff9442a7e88de3270d.tar.xz
glibc-0a54e4010fe0085cd36deaff9442a7e88de3270d.zip
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.
-rw-r--r--ChangeLog79
-rw-r--r--Makeconfig3
-rw-r--r--db/hash/hash.c2
-rw-r--r--elf/Makefile13
-rw-r--r--elf/dl-deps.c9
-rw-r--r--elf/dl-error.c2
-rw-r--r--elf/dl-load.c465
-rw-r--r--elf/dl-object.c1
-rw-r--r--elf/dl-support.c31
-rw-r--r--elf/elf.h5
-rw-r--r--elf/genrtldtbl.awk28
-rw-r--r--elf/link.h26
-rw-r--r--elf/rtld.c7
-rw-r--r--math/libm-test.c24
-rw-r--r--nss/libnss_files.map2
-rw-r--r--sunrpc/clnt_udp.c4
-rw-r--r--sysdeps/arm/machine-gmon.h55
-rw-r--r--sysdeps/generic/dl-sysdep.c37
-rw-r--r--sysdeps/generic/machine-gmon.h4
-rw-r--r--sysdeps/generic/strsep.c23
-rw-r--r--sysdeps/i386/dl-machine.h21
-rw-r--r--sysdeps/libm-ieee754/s_ccosh.c7
-rw-r--r--sysdeps/libm-ieee754/s_ccoshf.c7
-rw-r--r--sysdeps/libm-ieee754/s_ccoshl.c7
-rw-r--r--sysdeps/mach/hurd/dl-sysdep.c5
-rw-r--r--sysdeps/mips/bsd-_setjmp.S1
-rw-r--r--sysdeps/mips/bsd-setjmp.S1
-rw-r--r--sysdeps/mips/dl-machine.h10
-rw-r--r--sysdeps/mips/mips64/dl-machine.h10
-rw-r--r--sysdeps/sparc/udiv_qrnnd.S4
-rw-r--r--sysdeps/standalone/arm/bits/errno.h51
-rw-r--r--sysdeps/standalone/arm/sysdep.c32
-rw-r--r--sysdeps/unix/mips/sysdep.S2
-rw-r--r--sysdeps/unix/sysv/linux/dl-sysdep.c16
-rw-r--r--sysdeps/unix/sysv/linux/mips/clone.S2
-rw-r--r--sysdeps/unix/sysv/linux/sparc/__sigtrampoline.S4
36 files changed, 790 insertions, 210 deletions
diff --git a/ChangeLog b/ChangeLog
index 9f3ed378a5..842ed6f0dc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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)
+{
+ /*