touch-packages team mailing list archive
-
touch-packages team
-
Mailing list archive
-
Message #118518
[Bug 1253638] Re: dynamic linker does not use DT_RUNPATH for transitive dependencies
I don't know if this is expected behavior, but it's certainly annoying
behavior. I'm writing an app that depends on libtcodxx.so, which in turn
depends on libtcod.so. I want to ship them both in the lib directory
next to my app. With RUNPATH as "$ORIGIN/lib", it finds the direct
dependency (libtcodxx.so) and then doesn't look in the same directory
for its dependency. To get it to search there for both, I have to set
RPATH to "$ORIGIN/lib", and I suspect that RPATH may not technically be
supposed to support the $ORIGIN syntax.
--
You received this bug notification because you are a member of Ubuntu
Touch seeded packages, which is subscribed to eglibc in Ubuntu.
https://bugs.launchpad.net/bugs/1253638
Title:
dynamic linker does not use DT_RUNPATH for transitive dependencies
Status in eglibc package in Ubuntu:
Confirmed
Bug description:
$ lsb_release -rd
Description: Ubuntu 13.10
Release: 13.10
$ uname -a
Linux mhassert 3.11.0-13-generic #20-Ubuntu SMP Wed Oct 23 07:38:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
$gcc -dumpversion
4.8
$ ld -v
GNU ld (GNU Binutils for Ubuntu) 2.23.52.20130913
$ LC_ALL=C apt-cache policy libc-bin
libc-bin:
Installed: 2.17-93ubuntu4
* What you expected to happen
Binaries with DT_RPATH or DT_RUNPATH behaving identical in the absence of LD_LIBRARY_PATH
* What happened instead
DT_RUNPATH not searched for transitive dependencies.
When running a binary that depends on custom libraries which in turn depend on custom libraries, hard-coded search paths in DT_RUNPATH behave differently from those in DT_RPATH.
Paths in DT_RPATH are being considered for everything that is dynamically loaded, even dependencies of dependencies. Paths in DT_RUNPATH seem being considered only for direct dependencies of the binary.
Searching the web I think that the one and only difference between
DT_RPATH and DT_RUNPATH should be that DT_RPATH is considered _before_
LD_LIBRARY_PATH and DT_RUNPATH _afterwards_. In the absence of
LD_LIBRARY_PATH there should be no difference at all.
I stumbled upon this problem when switching from "ld" to "gold" for
the linker. The default for ld on Ubuntu 13.10 is "--disable-new-
dtags" while the default for gold is "--enable-new-dtags". Therefore
ld produces binaries with DT_RPATH and gold ones with DT_RUNPATH.
In the attached minimal example
- the binaries rpath and runpath both depend on libb but not directly on liba.
- libb depends on liba.
- liba and libb are linked without any hard-coded library paths.
- rpath and runpath are linked with hard-coded library paths for both liba and libb
- rpath is linked with --disable-new-dtags (producing DT_RPATH)
- rpath is linked with --enable-new-dtags (producing DT_RUNPATH)
To test, please run make all and observe how "rpath" works while
"runpath" fails to find liba at runtime.
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/eglibc/+bug/1253638/+subscriptions