diff options
author | Florian Weimer <fweimer@redhat.com> | 2019-06-28 10:12:50 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2019-06-28 10:15:38 +0200 |
commit | f0b2132b35248c1f4a80f62a2c38cddcc802aa8c (patch) | |
tree | 32e3b30bba3d07b48c40035d8a4011ed39a212ef /elf/Makefile | |
parent | 17432d7150bdab3bce2ea66c70ad6c920f54077a (diff) | |
download | glibc-f0b2132b35248c1f4a80f62a2c38cddcc802aa8c.tar.gz glibc-f0b2132b35248c1f4a80f62a2c38cddcc802aa8c.tar.xz glibc-f0b2132b35248c1f4a80f62a2c38cddcc802aa8c.zip |
ld.so: Support moving versioned symbols between sonames [BZ #24741]
This change should be fully backwards-compatible because the old code aborted the load if a soname mismatch was encountered (instead of searching further for a matching symbol). This means that no different symbols are found. The soname check was explicitly disabled for the skip_map != NULL case. However, this only happens with dl(v)sym and RTLD_NEXT, and those lookups do not come with a verneed entry that could be used for the check. The error check was already explicitly disabled for the skip_map != NULL case, that is, when dl(v)sym was called with RTLD_NEXT. But _dl_vsym always sets filename in the struct r_found_version argument to NULL, so the check was not active anyway. This means that symbol lookup results for the skip_map != NULL case do not change, either.
Diffstat (limited to 'elf/Makefile')
-rw-r--r-- | elf/Makefile | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/elf/Makefile b/elf/Makefile index 27a2fa8c14..a3eefd1b1f 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -191,7 +191,8 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \ tst-nodelete2 tst-audit11 tst-audit12 tst-dlsym-error tst-noload \ tst-latepthread tst-tls-manydynamic tst-nodelete-dlclose \ tst-debug1 tst-main1 tst-absolute-sym tst-absolute-zero tst-big-note \ - tst-unwind-ctor tst-unwind-main tst-audit13 + tst-unwind-ctor tst-unwind-main tst-audit13 \ + tst-sonamemove-link tst-sonamemove-dlopen # reldep9 tests-internal += loadtest unload unload2 circleload1 \ neededtest neededtest2 neededtest3 neededtest4 \ @@ -281,7 +282,8 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \ tst-nodelete-dlclose-dso tst-nodelete-dlclose-plugin \ tst-main1mod tst-libc_dlvsym-dso tst-absolute-sym-lib \ tst-absolute-zero-lib tst-big-note-lib tst-unwind-ctor-lib \ - tst-audit13mod1 + tst-audit13mod1 tst-sonamemove-linkmod1 \ + tst-sonamemove-runmod1 tst-sonamemove-runmod2 # 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%,\ @@ -1410,6 +1412,28 @@ $(objpfx)tst-audit13.out: $(objpfx)tst-audit13mod1.so LDFLAGS-tst-audit13mod1.so = -Wl,-z,lazy tst-audit13-ENV = LD_AUDIT=$(objpfx)tst-audit13mod1.so +# tst-sonamemove links against an older implementation of the library. +LDFLAGS-tst-sonamemove-linkmod1.so = \ + -Wl,--version-script=tst-sonamemove-linkmod1.map \ + -Wl,-soname,tst-sonamemove-runmod1.so +LDFLAGS-tst-sonamemove-runmod1.so = -Wl,--no-as-needed \ + -Wl,--version-script=tst-sonamemove-runmod1.map \ + -Wl,-soname,tst-sonamemove-runmod1.so +LDFLAGS-tst-sonamemove-runmod2.so = \ + -Wl,--version-script=tst-sonamemove-runmod2.map \ + -Wl,-soname,tst-sonamemove-runmod2.so +$(objpfx)tst-sonamemove-runmod1.so: $(objpfx)tst-sonamemove-runmod2.so +# Link against the link module, but depend on the run-time modules +# for execution. +$(objpfx)tst-sonamemove-link: $(objpfx)tst-sonamemove-linkmod1.so +$(objpfx)tst-sonamemove-link.out: \ + $(objpfx)tst-sonamemove-runmod1.so \ + $(objpfx)tst-sonamemove-runmod2.so +$(objpfx)tst-sonamemove-dlopen: $(libdl) +$(objpfx)tst-sonamemove-dlopen.out: \ + $(objpfx)tst-sonamemove-runmod1.so \ + $(objpfx)tst-sonamemove-runmod2.so + # Override -z defs, so that we can reference an undefined symbol. # Force lazy binding for the same reason. LDFLAGS-tst-latepthreadmod.so = \ |