Date: Wed, 12 Jan 2022 17:29:57 -0800 From: Farid Zakaria <fmzakari@...c.edu> To: musl@...ts.openwall.com Cc: "Scogland, Tom" <scogland1@...l.gov>, me@...menstoppels.nl, Carlos Maltzahn <carlosm@...c.edu> Subject: is RUNPATH being incorrectly inherited inherited? Hello, I'm observing a strange behavior and it seems to contradict what ld.so says should be the case for RUNPATH, namely I am observing that musl's dynamic linker seems to use the DT_RUNPATH of the executable when searching for entries of its children. > Using the directories specified in the DT_RUNPATH dynamic section attribute of the binary if present. Such directories are searched only to find those objects required by DT_NEEDED (direct dependencies) entries and do not apply to those objects' children, which must themselves have their own DT_RUNPATH entries. This is unlike DT_RPATH, which is applied to searches for all children in the dependency tree. I've uploaded a Makefile that you can use to follow along. First let's build the binary. It's designed to depend on two shared libraries _libx.so_ and _liby.so_; _liby.so_ also depends on _libx.so_ Note: that I make the top-level _libx.so_ an absolute path using patchelf. ``` # build it $ make CC=musl-gcc # let's inspect it to see what it looks like # here we can see the needed, including the one absolute $ patchelf --print-needed exe liby.so /home/fzakaria/code//c/libx.so libc.so # here is the RUNPATH $ patchelf --print-rpath exe $ORIGIN/b:$ORIGIN/c # an alternate query $ objdump -x ./exe | grep RUNPATH RUNPATH $ORIGIN/b:$ORIGIN/ # here is a dependent library $ patchelf --print-needed b/liby.so libx.so libc.so # liby.so has no RUNPATH objdump -x b/liby.so| grep RUNPATH ``` I would expect this *to not work* since there is no way for liby.so to discover libx.so, especially given the previous correspondence on the mailing lists on how musl does not utilize soname for the cache. However you can see that the linker is trying to resolve _libx.so_ using the RUNPATH when it is loading _liby.so_ ``` $ strace -e openat,stat,open ./exe open("/home/fzakaria/code/playground/cpp/musl-experiment/experiment-2/b/liby.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3 open("/home/fzakaria/code/playground/cpp/musl-experiment/experiment-2/c/libx.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3 open("/home/fzakaria/code/playground/cpp/musl-experiment/experiment-2/b/libx.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory) open("/home/fzakaria/code/playground/cpp/musl-experiment/experiment-2/c/libx.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3 24 +++ exited with 0 +++ ``` Harmen's libtree already fails to find the library. ``` $ libtree exe exe ├── libx.so [direct] └── .//b/liby.so [runpath] └── libx.so not found ┊ Paths considered ``` To me this means that the ld.so here is not respecting the description of not propagating the search paths to the children. FWIW, as per the other correspondence, if I remove part of the RUNPATH, then the binary fails to load even though _libx.so_ was already present. ``` $ patchelf --print-rpath exe $ORIGIN/b $ /exe Error loading shared library libx.so: No such file or directory (needed by /home/fzakaria/code/playground/cpp/musl-experiment/experiment-2/b/liby.so) ``` Thank you.  https://man7.org/linux/man-pages/man8/ld.so.8.html  https://gist.github.com/fzakaria/375f2c27f2db000369ec49a684ef8095  https://github.com/haampie/libtree
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.