I can't work out what scanelf is supposed to return for NEEDED entries that are missing or rely on the RPATH when --use-ldpath or --ldcache are given. With --use-ldpath, such entries are returned without a path, such as libfoo.so. With --ldcache, such entries are blank. Neither is very helpful if you can't tell the difference between missing entries and entries relying on the RPATH. Perhaps we need a --use-rpath option? Even if the RPATH were resolved, which behaviour is more correct? Returning missing entries as blank doesn't tell you which ones are actually missing. On the other hand, returning them without a path would still conflict with entries found in the same directory via the RPATH unless you always prepend the latter with "./".
please provide concrete examples of what you're looking at. the man page is pretty clear as to what both flags do when paired with -n. if you're getting blank paths, it's either an invalid load, or you have a pathological case that isn't handled currently.
I've written a script to scan the Steam library directory for missing dependencies. Now that it's almost finished, I realise I may not need this as much as I thought I did but there's still room for improvement. Here's some output to demonstrate the issue. $ scanelf -r Alien\ Isolation/bin/AlienIsolation TYPE RPATH FILE ET_EXEC $ORIGIN/../lib Alien Isolation/bin/AlienIsolation $ scanelf -n Alien\ Isolation/bin/AlienIsolation TYPE NEEDED FILE ET_EXEC libpcre.so.3,libjpeg.so.8,libCoreFoundation.so.476,libcurl.so.4,libvorbis.so.0,libpthread.so.0,librt.so.1,libdl.so.2,libSDL2-2.0.so.0,libSDL2_image-2.0.so.0,libz.so.1,libfreetype.so.6,libfontconfig.so.1,libstdc++.so.6,libm.so.6,libgcc_s.so.1,libc.so.6,ld-linux-x86-64.so.2 Alien Isolation/bin/AlienIsolation $ scanelf -n --use-ldpath Alien\ Isolation/bin/AlienIsolation TYPE NEEDED FILE ET_EXEC /usr/lib64/libpcre.so.3,libjpeg.so.8,libCoreFoundation.so.476,/usr/lib64/libcurl.so.4,/usr/lib64/libvorbis.so.0,/lib64/libpthread.so.0,/lib64/librt.so.1,/lib64/libdl.so.2,/usr/lib64/libSDL2-2.0.so.0,/usr/lib64/libSDL2_image-2.0.so.0,/lib64/libz.so.1,/usr/lib64/libfreetype.so.6,/usr/lib64/libfontconfig.so.1,/usr/lib/gcc/x86_64-pc-linux-gnu/5.3.0/32/libstdc++.so.6,/lib64/libm.so.6,/usr/lib/gcc/x86_64-pc-linux-gnu/5.3.0/32/libgcc_s.so.1,/lib64/libc.so.6,/lib64/ld-linux-x86-64.so.2 Alien Isolation/bin/AlienIsolation $ scanelf -n --ldcache Alien\ Isolation/bin/AlienIsolation TYPE NEEDED FILE ET_EXEC ,,,/usr/lib64/libcurl.so.4,/usr/lib64/libvorbis.so.0,/lib64/libpthread.so.0,/lib64/librt.so.1,/lib64/libdl.so.2,/usr/lib64/libSDL2-2.0.so.0,/usr/lib64/libSDL2_image-2.0.so.0,/lib64/libz.so.1,/usr/lib64/libfreetype.so.6,/usr/lib64/libfontconfig.so.1,/usr/lib/gcc/x86_64-pc-linux-gnu/5.3.0/libstdc++.so.6,/lib64/libm.so.6,/usr/lib/gcc/x86_64-pc-linux-gnu/5.3.0/libgcc_s.so.1,/lib64/libc.so.6,/lib64/ld-linux-x86-64.so.2 Alien Isolation/bin/AlienIsolation $ ldd Alien\ Isolation/bin/AlienIsolation Alien Isolation/bin/AlienIsolation: /usr/lib64/libldap_r-2.4.so.2: no version information available (required by /mnt/steam/SteamLibrary/SteamApps/common/Alien Isolation/bin/../lib/x86_64/libcurl.so.4) Alien Isolation/bin/AlienIsolation: /usr/lib64/liblber-2.4.so.2: no version information available (required by /mnt/steam/SteamLibrary/SteamApps/common/Alien Isolation/bin/../lib/x86_64/libcurl.so.4) Alien Isolation/bin/AlienIsolation: /usr/lib64/libssl.so.1.0.0: no version information available (required by /mnt/steam/SteamLibrary/SteamApps/common/Alien Isolation/bin/../lib/x86_64/libcurl.so.4) Alien Isolation/bin/AlienIsolation: /usr/lib64/libssl.so.1.0.0: no version information available (required by /mnt/steam/SteamLibrary/SteamApps/common/Alien Isolation/bin/../lib/x86_64/libcurl.so.4) Alien Isolation/bin/AlienIsolation: /usr/lib64/libcrypto.so.1.0.0: no version information available (required by /mnt/steam/SteamLibrary/SteamApps/common/Alien Isolation/bin/../lib/x86_64/libcurl.so.4) linux-vdso.so.1 (0x00007ffc30f7c000) libpcre.so.3 => /usr/lib64/libpcre.so.3 (0x00007feca72aa000) libjpeg.so.8 => not found libCoreFoundation.so.476 => /mnt/steam/SteamLibrary/SteamApps/common/Alien Isolation/bin/../lib/x86_64/libCoreFoundation.so.476 (0x00007feca6f07000) libcurl.so.4 => /mnt/steam/SteamLibrary/SteamApps/common/Alien Isolation/bin/../lib/x86_64/libcurl.so.4 (0x00007feca6c90000) libvorbis.so.0 => /usr/lib64/libvorbis.so.0 (0x00007feca6a64000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007feca6848000) librt.so.1 => /lib64/librt.so.1 (0x00007feca6640000) libdl.so.2 => /lib64/libdl.so.2 (0x00007feca643c000) libSDL2-2.0.so.0 => /usr/lib64/libSDL2-2.0.so.0 (0x00007feca6133000) libSDL2_image-2.0.so.0 => /usr/lib64/libSDL2_image-2.0.so.0 (0x00007feca5f10000) libz.so.1 => /lib64/libz.so.1 (0x00007feca5cfa000) libfreetype.so.6 => /usr/lib64/libfreetype.so.6 (0x00007feca763e000) libfontconfig.so.1 => /usr/lib64/libfontconfig.so.1 (0x00007feca5ab6000) libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/5.3.0/libstdc++.so.6 (0x00007feca56be000) libm.so.6 => /lib64/libm.so.6 (0x00007feca53bb000) libgcc_s.so.1 => /usr/lib/gcc/x86_64-pc-linux-gnu/5.3.0/libgcc_s.so.1 (0x00007feca51a4000) libc.so.6 => /lib64/libc.so.6 (0x00007feca4e0b000) /lib64/ld-linux-x86-64.so.2 (0x00007feca751c000) libuuid.so.1 => /lib64/libuuid.so.1 (0x00007feca4c06000) libicui18n.so.51 => /mnt/steam/SteamLibrary/SteamApps/common/Alien Isolation/bin/../lib/x86_64/libicui18n.so.51 (0x00007feca47ef000) libicuuc.so.51 => /mnt/steam/SteamLibrary/SteamApps/common/Alien Isolation/bin/../lib/x86_64/libicuuc.so.51 (0x00007feca445e000) libidn.so.11 => /usr/lib64/libidn.so.11 (0x00007feca422b000) librtmp.so.0 => not found libssl.so.1.0.0 => /usr/lib64/libssl.so.1.0.0 (0x00007feca3fbd000) libcrypto.so.1.0.0 => /usr/lib64/libcrypto.so.1.0.0 (0x00007feca3b81000) libgssapi_krb5.so.2 => /usr/lib64/libgssapi_krb5.so.2 (0x00007feca3935000) liblber-2.4.so.2 => /usr/lib64/liblber-2.4.so.2 (0x00007feca3726000) libldap_r-2.4.so.2 => /usr/lib64/libldap_r-2.4.so.2 (0x00007feca34d2000) libogg.so.0 => /usr/lib64/libogg.so.0 (0x00007feca32cb000) libpulse.so.0 => /usr/lib64/libpulse.so.0 (0x00007feca3076000) libX11.so.6 => /usr/lib64/libX11.so.6 (0x00007feca2d34000) libXext.so.6 => /usr/lib64/libXext.so.6 (0x00007feca2b22000) libXcursor.so.1 => /usr/lib64/libXcursor.so.1 (0x00007feca2917000) libXi.so.6 => /usr/lib64/libXi.so.6 (0x00007feca2707000) libXrandr.so.2 => /usr/lib64/libXrandr.so.2 (0x00007feca24fc000) libXxf86vm.so.1 => /usr/lib64/libXxf86vm.so.1 (0x00007feca22f6000) libwayland-egl.so.1 => /usr/lib64/libwayland-egl.so.1 (0x00007feca20f4000) libwayland-client.so.0 => /usr/lib64/libwayland-client.so.0 (0x00007feca1ee5000) libwayland-cursor.so.0 => /usr/lib64/libwayland-cursor.so.0 (0x00007feca1cdd000) libxkbcommon.so.0 => /usr/lib64/libxkbcommon.so.0 (0x00007feca1a9d000) libpng16.so.16 => /usr/lib64/libpng16.so.16 (0x00007feca1868000) libjpeg.so.62 => /usr/lib64/libjpeg.so.62 (0x00007feca160f000) libtiff.so.5 => /usr/lib64/libtiff.so.5 (0x00007feca139a000) libwebp.so.5 => /usr/lib64/libwebp.so.5 (0x00007feca113b000) libbz2.so.1 => /lib64/libbz2.so.1 (0x00007feca0f2b000) libexpat.so.1 => /usr/lib64/libexpat.so.1 (0x00007feca7609000) libicudata.so.51 => /mnt/steam/SteamLibrary/SteamApps/common/Alien Isolation/bin/../lib/x86_64/libicudata.so.51 (0x00007fec9f7e1000) libkrb5.so.3 => /usr/lib64/libkrb5.so.3 (0x00007fec9f509000) libk5crypto.so.3 => /usr/lib64/libk5crypto.so.3 (0x00007fec9f2d8000) libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007fec9f0d4000) libkrb5support.so.0 => /usr/lib64/libkrb5support.so.0 (0x00007fec9eec8000) libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007feca7603000) libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fec9ecb1000) libsasl2.so.3 => /usr/lib64/libsasl2.so.3 (0x00007fec9ea93000) libgnutls.so.30 => /usr/lib64/libgnutls.so.30 (0x00007fec9e76f000) libpulsecommon-9.0.so => /usr/lib64/pulseaudio/libpulsecommon-9.0.so (0x00007fec9e4e8000) libjson-c.so.2 => /usr/lib64/libjson-c.so.2 (0x00007fec9e2dd000) libdbus-1.so.3 => /usr/lib64/libdbus-1.so.3 (0x00007fec9e096000) libxcb.so.1 => /usr/lib64/libxcb.so.1 (0x00007fec9de73000) libXrender.so.1 => /usr/lib64/libXrender.so.1 (0x00007fec9dc69000) libXfixes.so.3 => /usr/lib64/libXfixes.so.3 (0x00007fec9da63000) libffi.so.6 => /usr/lib64/libffi.so.6 (0x00007fec9d85a000) libtasn1.so.6 => /usr/lib64/libtasn1.so.6 (0x00007feca75ed000) libnettle.so.6 => /usr/lib64/libnettle.so.6 (0x00007feca75b4000) libhogweed.so.4 => /usr/lib64/libhogweed.so.4 (0x00007feca757f000) libgmp.so.10 => /usr/lib64/libgmp.so.10 (0x00007fec9d5e1000) libX11-xcb.so.1 => /usr/lib64/libX11-xcb.so.1 (0x00007fec9d3df000) libICE.so.6 => /usr/lib64/libICE.so.6 (0x00007fec9d1c3000) libSM.so.6 => /usr/lib64/libSM.so.6 (0x00007fec9cfbb000) libXtst.so.6 => /usr/lib64/libXtst.so.6 (0x00007fec9cdb5000) libsndfile.so.1 => /usr/lib64/libsndfile.so.1 (0x00007fec9cb3e000) libXau.so.6 => /usr/lib64/libXau.so.6 (0x00007fec9c93a000) libXdmcp.so.6 => /usr/lib64/libXdmcp.so.6 (0x00007fec9c734000) libFLAC.so.8 => /usr/lib64/libFLAC.so.8 (0x00007fec9c4f8000) libvorbisenc.so.2 => /usr/lib64/libvorbisenc.so.2 (0x00007fec9c245000) libbsd.so.0 => /usr/lib64/libbsd.so.0 (0x00007feca7566000)
The blank libpcre.so.3 may be a red herring as I'd forgotten that I'd manually created a symlink to libpcre.so.1 (Debian versions it differently) a couple of weeks ago. libjpeg.so.8 really is missing and libCoreFoundation.so.476 can only be found via the RPATH.
these issues should all be fixed w/1.1.7. lemme know how it works for you.
I've seen the git log and I'm not sure exactly which change relates to this but I can see that --ldcache doesn't return blank entries any more. You still can't tell RPATH-dependent libraries apart from libraries that cannot be found at all but at least it's more consistent now. As I said, I didn't really need this in the end but thanks for improving it anyway. I may need it later.
(In reply to James Le Cuirot from comment #5) > You still can't tell RPATH-dependent libraries apart from libraries that > cannot be found at all but at least it's more consistent now. i don't know what you mean by this ... ldd/lddtree/scanelf have never given a marker that shows how a library was found. if an ELF has a RPATH entry, then they should be respecting it and searching that path. can you post an example of what you're talking about ?
(In reply to SpanKY from comment #6) > (In reply to James Le Cuirot from comment #5) > > You still can't tell RPATH-dependent libraries apart from libraries that > > cannot be found at all but at least it's more consistent now. > > i don't know what you mean by this ... ldd/lddtree/scanelf have never given > a marker that shows how a library was found. if an ELF has a RPATH entry, > then they should be respecting it and searching that path. > > can you post an example of what you're talking about ? Let's consider libCoreFoundation.so from the example above. It's only available via the RPATH entry of $ORIGIN/../lib. Here's what ldd shows. $ ldd Alien\ Isolation/bin/AlienIsolation | fgrep libCoreFoundation libCoreFoundation.so.476 => /mnt/steam/SteamLibrary/SteamApps/common/Alien Isolation/bin/../lib/x86_64/libCoreFoundation.so.476 (0x00007fb36dddf000) Here's what scanelf shows. $ scanelf -n --use-ldpath Alien\ Isolation/bin/AlienIsolation TYPE NEEDED FILE ET_EXEC libpcre.so.3,/usr/lib64/libjpeg.so.8,libCoreFoundation.so.476,/usr/lib64/libcurl.so.4,/usr/lib64/libvorbis.so.0,/lib64/libpthread.so.0,/lib64/librt.so.1,/lib64/libdl.so.2,/usr/lib64/libSDL2-2.0.so.0,/usr/lib64/libSDL2_image-2.0.so.0,/lib64/libz.so.1,/usr/lib64/libfreetype.so.6,/usr/lib64/libfontconfig.so.1,/usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/32/libstdc++.so.6,/lib64/libm.so.6,/usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/32/libgcc_s.so.1,/lib64/libc.so.6,/lib64/ld-linux-x86-64.so.2 Alien Isolation/bin/AlienIsolation See how it's simply shown as libCoreFoundation.so.476 without a path. Now let's move the library out the way. ldd says it's not found. $ ldd Alien\ Isolation/bin/AlienIsolation | fgrep libCoreFoundation libCoreFoundation.so.476 => not found scanelf's output is exactly the same as before. $ scanelf -n --use-ldpath Alien\ Isolation/bin/AlienIsolation TYPE NEEDED FILE ET_EXEC libpcre.so.3,/usr/lib64/libjpeg.so.8,libCoreFoundation.so.476,/usr/lib64/libcurl.so.4,/usr/lib64/libvorbis.so.0,/lib64/libpthread.so.0,/lib64/librt.so.1,/lib64/libdl.so.2,/usr/lib64/libSDL2-2.0.so.0,/usr/lib64/libSDL2_image-2.0.so.0,/lib64/libz.so.1,/usr/lib64/libfreetype.so.6,/usr/lib64/libfontconfig.so.1,/usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/32/libstdc++.so.6,/lib64/libm.so.6,/usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/32/libgcc_s.so.1,/lib64/libc.so.6,/lib64/ld-linux-x86-64.so.2 Alien Isolation/bin/AlienIsolation I guess what I'm really trying to say is that resolution via RPATH still isn't working here. Perhaps it's not dealing with $ORIGIN?
scanelf today does not handle any rpath tags, $ORIGIN or otherwise. i can look into adding support for it for --needed output. no ETA though.
*** Bug 653586 has been marked as a duplicate of this bug. ***