about summary refs log tree commit diff
path: root/elf
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2000-07-21 04:12:25 +0000
committerUlrich Drepper <drepper@redhat.com>2000-07-21 04:12:25 +0000
commit2f54c82dacba646139a773ab43fc2cdb47ee1f5b (patch)
tree083e05712adaa46da2ff502b6382b9eeaa0420a1 /elf
parent89bc5366ba0418306d70becabe511a3f56a084e3 (diff)
downloadglibc-2f54c82dacba646139a773ab43fc2cdb47ee1f5b.tar.gz
glibc-2f54c82dacba646139a773ab43fc2cdb47ee1f5b.tar.xz
glibc-2f54c82dacba646139a773ab43fc2cdb47ee1f5b.zip
Update.
	* elf/Makefile (tests): Add nodlopen.  Add rules to generate nodlopen.
	* include/dlfcn.h: Define __RTLD_DLOPEN.
	* elf/dl-load.c (_dl_map_object_from_fd): If DF_1_NOOPEN is set
	and this is a dlopen() call, do not load the binary.
	* dlfcn/dlopen.c: Add __RTLD_DLOPEN to mode passed down to _dl_open.
	* dlfcn/dlopenold.c: Likewise.
	* configure.in: Add test for -z nodelete option.
	* config.make.in: Define have-z-nodelete with libc_cv_z_nodelete.

2000-07-20  Mark Kettenis  <kettenis@gnu.org>

	Make Hesiod NSS module thread-safe.

	* hesiod/README.hesiod: Update.

	* hesiod/Versions [GLIBC_2.2]: Add _nss_hesiod_getservbyport_r,
	_nss_hesiod_setprotoent, _nss_hesiod_endprotoent,
	_nss_hesiod_getprotobyname_r, and _nss_hesiod_getprotobynumber_r.
	* hesiod/Makefile (libnss_hesiod-routines): Add hesiod-init and
	hesiod-proto.
	* hesiod/nss_hesiod/hesiod-init.c: New file.
	* hesiod/nss_hesiod/hesiod-pwd.c: Rewritten for thread-safeness.
	* hesiod/nss_hesiod/hesiod-grp.c: Likewise.
	* hesiod/nss_hesiod/nss_hesiod.h: New file.
	* hesiod/nss_hesiod/hesiod-service.c
	(_nss_hesiod_getservbyport_r): New function.  Provide support for
	looking up services by port number.
	* hesiod/nss_hesiod/hesiod-proto.c: New file.

	* hesiod/hesiod.c: Update from BIND 8.2.3-T5B.
	* hesiod/hesiod.h: Likewise.
	* hesiod/hesiod_p.h: Likewise.

2000-07-20  Mark Kettenis  <kettenis@gnu.org>

	Fix problems with `struct __res_state' getting too big.
	* resolv/resolv.h (struct __sockaddr_in): New definition.
	(struct __res_state): Use __sockaddr_in instead of sockaddr_in in
	the private parts of the structure to save some space.
	* resolv/res_send.c (res_nsend): Cast &EXT(statp).nsaddrs[ns] to
	(struct sockaddr_in *) in call to sock_eq.
	Use memcpy to copy statp->nsaddr_list[ns] to &EXT(statp).nsaddrs[ns].

2000-07-20  Ulrich Drepper  <drepper@redhat.com>

	* sysdeps/mach/hurd/dl-sysdep.c: Likewise.
Diffstat (limited to 'elf')
-rw-r--r--elf/Makefile12
-rw-r--r--elf/dl-load.c37
-rw-r--r--elf/dl-open.c2
3 files changed, 44 insertions, 7 deletions
diff --git a/elf/Makefile b/elf/Makefile
index db6d4283ba..b18aafe8e7 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -86,16 +86,20 @@ endif
 ifeq (yes,$(build-shared))
 tests = loadtest restest1 preloadtest loadfail multiload origtest resolvfail \
 	constload1 order $(tests-vis-$(have-protected)) noload \
-	$(tests-nodelete-$(have-z-nodelete))
+	$(tests-nodelete-$(have-z-nodelete)) \
+	$(tests-nodlopen-$(have-z-nodlopen))
 tests-vis-yes = vismain
 tests-nodelete-yes = nodelete
+tests-nodlopen-yes = nodlopen
 endif
 modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
 		testobj1_1 failobj constload2 constload3 \
 		dep1 dep2 dep3 dep4 $(modules-vis-$(have-protected)) \
-		$(modules-nodelete-$(have-z-nodelete))
+		$(modules-nodelete-$(have-z-nodelete)) \
+		$(modules-nodlopen-$(have-z-nodlopen))
 modules-vis-yes = vismod1 vismod2 vismod3
 modules-nodelete-yes = nodelmod1 nodelmod2
+modules-nodlopen-yes = nodlopenmod
 extra-objs += $(addsuffix .os,$(strip $(modules-names)))
 
 include ../Rules
@@ -302,3 +306,7 @@ $(objpfx)noload.out: $(objpfx)testobj5.so
 LDFLAGS-nodelmod1.so = -Wl,--enable-new-dtags,-z,nodelete
 $(objpfx)nodelete: $(libdl)
 $(objpfx)nodelete.out: $(objpfx)nodelmod1.so $(objpfx)nodelmod2.so
+
+LDFLAGS-nodlopenmod.so = -Wl,--enable-new-dtags,-z,nodlopen
+$(objpfx)nodlopen: $(libdl)
+$(objpfx)nodlopen.out: $(objpfx)nodlopenmod.so
diff --git a/elf/dl-load.c b/elf/dl-load.c
index fbf82e2068..1e5ad5073d 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -688,7 +688,7 @@ static
 #endif
 struct link_map *
 _dl_map_object_from_fd (const char *name, int fd, char *realname,
-			struct link_map *loader, int l_type, int noload)
+			struct link_map *loader, int l_type, int mode)
 {
   /* This is the expected ELF header.  */
 #define ELF32_CLASS ELFCLASS32
@@ -752,7 +752,7 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
 	return l;
       }
 
-  if (noload)
+  if (mode & RTLD_NOLOAD)
     /* We are not supposed to load the object unless it is already
        loaded.  So return now.  */
     return NULL;
@@ -1097,6 +1097,35 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
     }
 
   elf_get_dynamic_info (l);
+
+  /* Make sure we are dlopen()ing an object which has the DF_1_NOOPEN
+     flag set.  */
+  if (__builtin_expect (l->l_flags_1 & DF_1_NOOPEN, 0)
+      && (mode & __RTLD_DLOPEN))
+    {
+      /* Remove from the module list.  */
+      assert (l->l_next == NULL);
+#ifdef SHARED
+      if (l->l_prev == NULL)
+	/* No other module loaded.  */
+	_dl_loaded = NULL;
+      else
+#endif
+	l->l_prev->l_next = NULL;
+
+      /* We are not supposed to load this object.  Free all resources.  */
+      __munmap ((void *) l->l_map_start, l->l_map_end - l->l_map_start);
+
+      free (l->l_libname);
+
+      if (l->l_phdr_allocated)
+	free ((void *) l->l_phdr);
+
+      free (l);
+
+      _dl_signal_error (0, name, N_("shared object cannot be dlopen()ed"));
+    }
+
   if (l->l_info[DT_HASH])
     _dl_setup_hash (l);
 
@@ -1306,7 +1335,7 @@ open_path (const char *name, size_t namelen, int preloaded,
 struct link_map *
 internal_function
 _dl_map_object (struct link_map *loader, const char *name, int preloaded,
-		int type, int trace_mode, int noload)
+		int type, int trace_mode, int mode)
 {
   int fd;
   char *realname;
@@ -1506,5 +1535,5 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
 	_dl_signal_error (errno, name, N_("cannot open shared object file"));
     }
 
-  return _dl_map_object_from_fd (name, fd, realname, loader, type, noload);
+  return _dl_map_object_from_fd (name, fd, realname, loader, type, mode);
 }
diff --git a/elf/dl-open.c b/elf/dl-open.c
index 477ecdf62e..60a8f1ad5b 100644
--- a/elf/dl-open.c
+++ b/elf/dl-open.c
@@ -145,7 +145,7 @@ dl_open_worker (void *a)
 
   /* Load the named object.  */
   args->map = new = _dl_map_object (NULL, file, 0, lt_loaded, 0,
-				    mode & RTLD_NOLOAD);
+				    mode);
 
   /* If the pointer returned is NULL this means the RTLD_NOLOAD flag is
      set and the object is not already loaded.  */