diff options
author | Florian Weimer <fweimer@redhat.com> | 2019-11-13 15:44:56 +0100 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2019-11-27 20:55:35 +0100 |
commit | f63b73814f74032c0e5d0a83300e3d864ef905e5 (patch) | |
tree | dac6303d0f785a7103ede6546011bf430a42e236 /elf/Makefile | |
parent | a509eb117fac1d764b15eba64993f4bdb63d7f3c (diff) | |
download | glibc-f63b73814f74032c0e5d0a83300e3d864ef905e5.zip glibc-f63b73814f74032c0e5d0a83300e3d864ef905e5.tar.gz glibc-f63b73814f74032c0e5d0a83300e3d864ef905e5.tar.bz2 |
Remove all loaded objects if dlopen fails, ignoring NODELETE [BZ #20839]
This introduces a “pending NODELETE” state in the link map, which is
flipped to the persistent NODELETE state late in dlopen, via
activate_nodelete. During initial relocation, symbol binding
records pending NODELETE state only. dlclose ignores pending NODELETE
state. Taken together, this results that a partially completed dlopen
is rolled back completely because new NODELETE mappings are unloaded.
Tested on x86_64-linux-gnu and i386-linux-gnu.
Change-Id: Ib2a3d86af6f92d75baca65431d74783ee0dbc292
Diffstat (limited to 'elf/Makefile')
-rw-r--r-- | elf/Makefile | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/elf/Makefile b/elf/Makefile index 30c3896..305bed2 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -199,7 +199,7 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \ tst-debug1 tst-main1 tst-absolute-sym tst-absolute-zero tst-big-note \ tst-unwind-ctor tst-unwind-main tst-audit13 \ tst-sonamemove-link tst-sonamemove-dlopen tst-dlopen-tlsmodid \ - tst-dlopen-self tst-auditmany tst-initfinilazyfail + tst-dlopen-self tst-auditmany tst-initfinilazyfail tst-dlopenfail # reldep9 tests-internal += loadtest unload unload2 circleload1 \ neededtest neededtest2 neededtest3 neededtest4 \ @@ -291,7 +291,8 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \ tst-auditmanymod1 tst-auditmanymod2 tst-auditmanymod3 \ tst-auditmanymod4 tst-auditmanymod5 tst-auditmanymod6 \ tst-auditmanymod7 tst-auditmanymod8 tst-auditmanymod9 \ - tst-initlazyfailmod tst-finilazyfailmod + tst-initlazyfailmod tst-finilazyfailmod \ + tst-dlopenfailmod1 tst-dlopenfaillinkmod tst-dlopenfailmod2 # Most modules build with _ISOMAC defined, but those filtered out # depend on internal headers. modules-names-tests = $(filter-out ifuncmod% tst-libc_dlvsym-dso tst-tlsmod%,\ @@ -1597,3 +1598,13 @@ LDFLAGS-tst-initlazyfailmod.so = \ -Wl,-z,lazy -Wl,--unresolved-symbols=ignore-all LDFLAGS-tst-finilazyfailmod.so = \ -Wl,-z,lazy -Wl,--unresolved-symbols=ignore-all + +$(objpfx)tst-dlopenfail: $(libdl) +$(objpfx)tst-dlopenfail.out: \ + $(objpfx)tst-dlopenfailmod1.so $(objpfx)tst-dlopenfailmod2.so +# Order matters here. tst-dlopenfaillinkmod.so's soname ensures +# a run-time loader failure. +$(objpfx)tst-dlopenfailmod1.so: \ + $(shared-thread-library) $(objpfx)tst-dlopenfaillinkmod.so +LDFLAGS-tst-dlopenfaillinkmod.so = -Wl,-soname,tst-dlopenfail-missingmod.so +$(objpfx)tst-dlopenfailmod2.so: $(shared-thread-library) |