aboutsummaryrefslogtreecommitdiff
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.zip
glibc-2f54c82dacba646139a773ab43fc2cdb47ee1f5b.tar.gz
glibc-2f54c82dacba646139a773ab43fc2cdb47ee1f5b.tar.bz2
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 db6d428..b18aafe 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 fbf82e2..1e5ad50 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 477ecdf..60a8f1a 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. */