2
votes

ldd fail to find a dll, that is present in the rpath definition. Some others libraries are found (check /./../lib/*)

Here the output of ldd (we can see that 2 dll are found in ../lib, but not libexpat.so.0:

root@hyperstream:/DT/local/ADE-trunk4/build-ADE-Desktop-Default/bin# ldd ./ade_admin linux-vdso.so.1 => (0x00007ffeb9796000) libadeversion.so => /DT/local/ADE-trunk4/build-ADE-Desktop-Default/bin/./../lib/libadeversion.so (0x00007f31abaef000) libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007f31ab8ca000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f31ab6ac000) libaprutil-1.so.0 => /DT/local/ADE-trunk4/build-ADE-Desktop-Default/bin/./../lib/libaprutil-1.so.0 (0x00007f31ab58c000) libapr-1.so.0 => /DT/local/ADE-trunk4/build-ADE-Desktop-Default/bin/./../lib/libapr-1.so.0 (0x00007f31ab460000) libavahi-client.so.3 => /usr/lib/x86_64-linux-gnu/libavahi-client.so.3 (0x00007f31ab24d000) libavahi-common.so.3 => /usr/lib/x86_64-linux-gnu/libavahi-common.so.3 (0x00007f31ab041000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f31aae3d000) libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f31aaab5000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f31aa7ac000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f31aa595000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f31aa1cc000) /lib64/ld-linux-x86-64.so.2 (0x0000560d30a76000) libexpat.so.0 => not found librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f31a9fc4000) [...]

root@hyperstream:/DT/local/ADE-trunk4/build-ADE-Desktop-Default/bin# file ../lib/libexpat.so.0 ../lib/libexpat.so.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=762de704943d03033d01a9725216d6b05d0740f5, not stripped

Here the rpath:

root@hyperstream:/DT/local/ADE-trunk4/build-ADE-Desktop-Default/bin# readelf -d ade_admin | grep 'R.*PATH' 16: 0x000000000000001d (RUNPATH) Library runpath: [${ORIGIN}/../lib]

Now the killer fact: It's works with clang 3.8, but fail with gcc 6.3 (ubuntu 16.10)

Obviously adding an LD_LIBRARY_PATH=../lib make it works again, but the goal of rpath was to avoid to set it

root@hyperstream:/DT/local/ADE-trunk4/build-ADE-Desktop-Default/bin# export LD_LIBRARY_PATH=../lib root@hyperstream:/DT/local/ADE-trunk4/build-ADE-Desktop-Default/bin# ldd ./ade_admin linux-vdso.so.1 => (0x00007ffea23b6000) libadeversion.so => ../lib/libadeversion.so (0x00007f78c6474000) libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007f78c624f000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f78c6031000) libaprutil-1.so.0 => ../lib/libaprutil-1.so.0 (0x00007f78c5f11000) libapr-1.so.0 => ../lib/libapr-1.so.0 (0x00007f78c5de5000) libavahi-client.so.3 => /usr/lib/x86_64-linux-gnu/libavahi-client.so.3 (0x00007f78c5bd2000) libavahi-common.so.3 => /usr/lib/x86_64-linux-gnu/libavahi-common.so.3 (0x00007f78c59c6000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f78c57c2000) libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f78c543a000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f78c5131000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f78c4f1a000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f78c4b51000) /lib64/ld-linux-x86-64.so.2 (0x0000559fdceab000) libexpat.so.0 => ../lib/libexpat.so.0 (0x00007f78c492a000)

Any idea ?

Regards

Laurent

1
Just so you know, a "DLL" is the Windows-specific name for a shared library. In Linux/Unix land, we just call them "shared libraries" or "SOs" (pronounced "ess ohs"). Seeing "RPATH" and "DLL" in the same sentence is odd because Windows doesn't have an RPATH equivalent.Alex Reinking

1 Answers

2
votes

I just find the explanation: clang put in the [NEEDED] section of the elf binary ALL libraries (even libraries not explicitely included by myself, but referenced by the [NEEDED] section of the library that I include

example from gcc:

readelf -d my_prog

Dynamic section at offset 0x9cb548 contains 46 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libadeversion.so]
 0x0000000000000001 (NEEDED)             Shared library: [libuuid.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libsqlite3.so]
 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libaprutil-1.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libapr-1.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libavahi-client.so.3]
 0x0000000000000001 (NEEDED)             Shared library: [libavahi-common.so.3]
 0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
 0x0000000000000001 (NEEDED)             Shared library: [libaio.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [lib_adm64.so]
 0x0000000000000001 (NEEDED)             Shared library: [lib_dict64.so]
 0x0000000000000001 (NEEDED)             Shared library: [lib_rdm64.so]
 0x0000000000000001 (NEEDED)             Shared library: [lib_dbr64.so]
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000001d (RUNPATH)            Library runpath: [${ORIGIN}/../lib/:$ORIGIN/../lib/:../lib/]

from clang:

readelf -d my_prog

Dynamic section at offset 0xa7bae8 contains 54 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libadeversion.so]
 0x0000000000000001 (NEEDED)             Shared library: [libuuid.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libsqlite3.so]
 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libaprutil-1.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libexpat.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libapr-1.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libavahi-client.so.3]
 0x0000000000000001 (NEEDED)             Shared library: [libavahi-common.so.3]
 0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
 0x0000000000000001 (NEEDED)             Shared library: [libaio.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libcrypt.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [lib_adm64.so]
 0x0000000000000001 (NEEDED)             Shared library: [lib_dict64.so]
 0x0000000000000001 (NEEDED)             Shared library: [lib_rdm64.so]
 0x0000000000000001 (NEEDED)             Shared library: [lib_rpc64.so]
 0x0000000000000001 (NEEDED)             Shared library: [lib_sql64.so]
 0x0000000000000001 (NEEDED)             Shared library: [lib_rdbc64.so]
 0x0000000000000001 (NEEDED)             Shared library: [lib_rm64.so]
 0x0000000000000001 (NEEDED)             Shared library: [lib_ncp64.so]
 0x0000000000000001 (NEEDED)             Shared library: [lib_cmp64.so]
 0x0000000000000001 (NEEDED)             Shared library: [lib_repfltr64.so]
 0x0000000000000001 (NEEDED)             Shared library: [lib_expat64.so]
 0x0000000000000001 (NEEDED)             Shared library: [lib_cncp64.so]
 0x0000000000000001 (NEEDED)             Shared library: [lib_dbr64.so]
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000001d (RUNPATH)            Library runpath: [${ORIGIN}/../lib/:$ORIGIN/../lib/:../lib/]

And one dll include the missing one libexpat:

readelf -d ../lib/libaprutil-1.so.0 

Dynamic section at offset 0x1e698 contains 29 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: **[libexpat.so.0]**
 0x0000000000000001 (NEEDED)             Shared library: [libapr-1.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libuuid.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libcrypt.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000e (SONAME)             Library soname: [libaprutil-1.so.0]

but RUNPATH is only used by the binary not by the dll (that can have is own RUNPATH too).

2 solutions: - add a RUNPATH in libaprutil-1.so.0 to force to include library from "." - add explicitely all missing dll in my build

Hope it help