diff options
Diffstat (limited to 'elf')
-rw-r--r-- | elf/Makefile | 30 | ||||
-rw-r--r-- | elf/dl-close.c | 11 |
2 files changed, 28 insertions, 13 deletions
diff --git a/elf/Makefile b/elf/Makefile index e600cc3982..125edcc1e9 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -28,7 +28,7 @@ routines = $(dl-routines) dl-support dl-iteratephdr \ # The core dynamic linking functions are in libc for the static and # profiled libraries. dl-routines = $(addprefix dl-,load cache lookup object reloc deps \ - runtime error init fini debug misc \ + runtime error init fini debug misc \ version profile conflict tls origin scope \ execstack caller open close trampoline) all-dl-routines = $(dl-routines) $(sysdep-dl-routines) @@ -89,6 +89,7 @@ distribute := rtld-Rules \ unload4mod1.c unload4mod2.c unload4mod3.c unload4mod4.c \ unload6mod1.c unload6mod2.c unload6mod3.c \ unload7mod1.c unload7mod2.c \ + unload8mod1.c unload8mod1x.c unload8mod2.c unload8mod3.c \ tst-audit1.c tst-audit2.c tst-audit3.c tst-audit4.c \ tst-auditmod1.c tst-auditmod3a.c tst-auditmod3b.c \ tst-auditmod4a.c tst-auditmod4b.c \ @@ -195,7 +196,7 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \ tst-align tst-align2 $(tests-execstack-$(have-z-execstack)) \ tst-dlmodcount tst-dlopenrpath tst-deep1 \ tst-dlmopen1 tst-dlmopen2 tst-dlmopen3 \ - unload3 unload4 unload5 unload6 unload7 tst-global1 order2 \ + unload3 unload4 unload5 unload6 unload7 unload8 tst-global1 order2 \ tst-audit1 tst-audit2 \ tst-stackguard1 tst-addr1 tst-thrlock \ tst-unique1 tst-unique2 @@ -224,7 +225,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \ neededobj5 neededobj6 firstobj globalmod1 \ unload2mod unload2dep ltglobmod1 ltglobmod2 pathoptobj \ dblloadmod1 dblloadmod2 dblloadmod3 reldepmod5 reldepmod6 \ - reldep6mod0 reldep6mod1 reldep6mod2 reldep6mod3 reldep6mod4 \ + reldep6mod0 reldep6mod1 reldep6mod2 reldep6mod3 reldep6mod4 \ reldep7mod1 reldep7mod2 \ tst-tlsmod1 tst-tlsmod2 tst-tlsmod3 tst-tlsmod4 \ tst-tlsmod5 tst-tlsmod6 tst-tlsmod7 tst-tlsmod8 \ @@ -246,6 +247,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \ unload4mod1 unload4mod2 unload4mod3 unload4mod4 \ unload6mod1 unload6mod2 unload6mod3 \ unload7mod1 unload7mod2 \ + unload8mod1 unload8mod1x unload8mod2 unload8mod3 \ order2mod1 order2mod2 order2mod3 order2mod4 \ tst-unique1mod1 tst-unique1mod2 \ tst-unique2mod1 tst-unique2mod2 @@ -521,6 +523,9 @@ $(objpfx)unload6mod2.so: $(libdl) $(objpfx)unload6mod3.so: $(libdl) $(objpfx)unload7mod1.so: $(libdl) $(objpfx)unload7mod2.so: $(objpfx)unload7mod1.so +$(objpfx)unload8mod1.so: $(objpfx)unload8mod2.so +$(objpfx)unload8mod2.so: $(objpfx)unload8mod3.so +$(objpfx)unload8mod3.so: $(libdl) LDFLAGS-tst-tlsmod5.so = -nostdlib LDFLAGS-tst-tlsmod6.so = -nostdlib @@ -822,6 +827,9 @@ $(objpfx)unload7: $(libdl) $(objpfx)unload7.out: $(objpfx)unload7mod1.so $(objpfx)unload7mod2.so unload7-ENV = MALLOC_PERTURB_=85 +$(objpfx)unload8: $(libdl) +$(objpfx)unload8.out: $(objpfx)unload8mod1.so $(objpfx)unload8mod1x.so + ifdef libdl $(objpfx)tst-tls9-static: $(common-objpfx)dlfcn/libdl.a $(objpfx)tst-tls9-static.out: $(objpfx)tst-tlsmod5.so $(objpfx)tst-tlsmod6.so @@ -925,11 +933,11 @@ $(objpfx)tst-dlmodcount: $(libdl) $(objpfx)tst-dlmodcount.out: $(test-modules) check-data := $(firstword $(wildcard \ - $(foreach D,$(add-ons) scripts,\ - $(patsubst %,$(..)$D/data/localplt-%.data,\ - $(abi-name) \ - $(addsuffix -$(config-os),\ - $(config-machine) \ + $(foreach D,$(add-ons) scripts,\ + $(patsubst %,$(..)$D/data/localplt-%.data,\ + $(abi-name) \ + $(addsuffix -$(config-os),\ + $(config-machine) \ $(base-machine)) \ generic)))) @@ -941,9 +949,9 @@ endif $(objpfx)check-localplt.out: $(objpfx)check-localplt \ $(common-objpfx)libc.so \ - $(common-objpfx)math/libm.so $(thread-dso) \ - $(common-objpfx)rt/librt.so \ - $(common-objpfx)dlfcn/libdl.so \ + $(common-objpfx)math/libm.so $(thread-dso) \ + $(common-objpfx)rt/librt.so \ + $(common-objpfx)dlfcn/libdl.so \ $(common-objpfx)resolv/libresolv.so \ $(common-objpfx)crypt/libcrypt.so \ $(check-data) diff --git a/elf/dl-close.c b/elf/dl-close.c index 700e765c3c..5b54e9f2f6 100644 --- a/elf/dl-close.c +++ b/elf/dl-close.c @@ -1,5 +1,5 @@ /* Close a shared object opened by `_dl_open'. - Copyright (C) 1996-2007, 2009 Free Software Foundation, Inc. + Copyright (C) 1996-2007, 2009, 2010 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -274,7 +274,7 @@ _dl_close_worker (struct link_map *map) } #ifdef SHARED - /* Auditing checkpoint: we have a new object. */ + /* Auditing checkpoint: we remove an object. */ if (__builtin_expect (do_audit, 0)) { struct audit_ifaces *afct = GLRO(dl_audit); @@ -421,6 +421,13 @@ _dl_close_worker (struct link_map *map) imap->l_scope_max = new_size; } + else if (new_list != NULL) + { + /* We didn't change the scope array, so reset the search + list. */ + imap->l_searchlist.r_list = NULL; + imap->l_searchlist.r_nlist = 0; + } /* The loader is gone, so mark the object as not having one. Note: l_idx != IDX_STILL_USED -> object will be removed. */ |