I'm compiling a software with CMake and GCC under Ubuntu 18. Here's the relevant CMake line:
set(CMAKE_INSTALL_RPATH "$ORIGIN/../lib/")
setting the runpath relative to the origin.
Once the software is installed using CMake, readelf gives this information:
$ readelf -a my_exe | grep RUNPATH
0x000000000000001d (RUNPATH) Library runpath: [$ORIGIN/../..lib/]
When running LD_DEBUG=libs ./my_exe, this is the output (shortened for readability):
10093: find library=libgmp.so.10 [0]; searching
10093: search path=/home/buildbot/install/exe/../lib/tls/haswell/x86_64:/home/buildbot/install/exe/../lib/tls/haswell:/home/buildbot/install/exe/../lib/tls/x86_64:/home/buildbot/install/exe/../lib/tls:/home/buildbot/install/exe/../lib/haswell/x86_64:/home/buildbot/install/exe/../lib/haswell:/home/buildbot/install/exe/../lib/x86_64:/home/buildbot/install/exe/../lib (RUNPATH from file ./exe/my_exe)
10093: trying file=/home/buildbot/install/exe/../lib/tls/haswell/x86_64/libgmp.so.10
10093: trying file=/home/buildbot/install/exe/../lib/tls/haswell/libgmp.so.10
10093: trying file=/home/buildbot/install/exe/../lib/tls/x86_64/libgmp.so.10
10093: trying file=/home/buildbot/install/exe/../lib/tls/libgmp.so.10
10093: trying file=/home/buildbot/install/exe/../lib/haswell/x86_64/libgmp.so.10
10093: trying file=/home/buildbot/install/exe/../lib/haswell/libgmp.so.10
10093: trying file=/home/buildbot/install/exe/../lib/x86_64/libgmp.so.10
10093: trying file=/home/buildbot/install/exe/../lib/libgmp.so.10
10093: search cache=/etc/ld.so.cache
10093: trying file=/usr/lib/x86_64-linux-gnu/libgmp.so.10
10093:
10093: find library=libpthread.so.0 [0]; searching
10093: search path=/home/buildbot/install/exe/../lib (RUNPATH from file ./exe/my_exe)
10093: trying file=/home/buildbot/install/exe/../lib/libpthread.so.0
10093: search cache=/etc/ld.so.cache
10093: trying file=/lib/x86_64-linux-gnu/libpthread.so.0
[...]
10093:
10093: find library=libc.so.6 [0]; searching
10093: search path=/home/buildbot/install/exe/../lib (RUNPATH from file ./exe/my_exe)
10093: trying file=/home/buildbot/install/exe/../lib/libc.so.6
10093: search cache=/etc/ld.so.cache
10093: trying file=/lib/x86_64-linux-gnu/libc.so.6
10093:
10093: find library=libz.so.1 [0]; searching
10093: search cache=/etc/ld.so.cache
10093: trying file=/lib/x86_64-linux-gnu/libz.so.1
[...]
10093:
10093: find library=libcrypto.so.1.1 [0]; searching
10093: search cache=/etc/ld.so.cache
10093: trying file=/usr/lib/x86_64-linux-gnu/libcrypto.so.1.1
10093:
10093: find library=libHalf-2_3.so.24 [0]; searching
10093: search cache=/etc/ld.so.cache
10093: search path=/lib/x86_64-linux-gnu/tls/haswell/x86_64:/lib/x86_64-linux-gnu/tls/haswell:/lib/x86_64-linux-gnu/tls/x86_64:/lib/x86_64-linux-gnu/tls:/lib/x86_64-linux-gnu/haswell/x86_64:/lib/x86_64-linux-gnu/haswell:/lib/x86_64-linux-gnu/x86_64:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu/tls/haswell/x86_64:/usr/lib/x86_64-linux-gnu/tls/haswell:/usr/lib/x86_64-linux-gnu/tls/x86_64:/usr/lib/x86_64-linux-gnu/tls:/usr/lib/x86_64-linux-gnu/haswell/x86_64:/usr/lib/x86_64-linux-gnu/haswell:/usr/lib/x86_64-linux-gnu/x86_64:/usr/lib/x86_64-linux-gnu:/lib/tls/haswell/x86_64:/lib/tls/haswell:/lib/tls/x86_64:/lib/tls:/lib/haswell/x86_64:/lib/haswell:/lib/x86_64:/lib:/usr/lib/tls/haswell/x86_64:/usr/lib/tls/haswell:/usr/lib/tls/x86_64:/usr/lib/tls:/usr/lib/haswell/x86_64:/usr/lib/haswell:/usr/lib/x86_64:/usr/lib (system search path)
10093: trying file=/lib/x86_64-linux-gnu/tls/haswell/x86_64/libHalf-2_3.so.24
10093: trying file=/lib/x86_64-linux-gnu/tls/haswell/libHalf-2_3.so.24
10093: trying file=/lib/x86_64-linux-gnu/tls/x86_64/libHalf-2_3.so.24
10093: trying file=/lib/x86_64-linux-gnu/tls/libHalf-2_3.so.24
10093: trying file=/lib/x86_64-linux-gnu/haswell/x86_64/libHalf-2_3.so.24
10093: trying file=/lib/x86_64-linux-gnu/haswell/libHalf-2_3.so.24
10093: trying file=/lib/x86_64-linux-gnu/x86_64/libHalf-2_3.so.24
10093: trying file=/lib/x86_64-linux-gnu/libHalf-2_3.so.24
10093: trying file=/usr/lib/x86_64-linux-gnu/tls/haswell/x86_64/libHalf-2_3.so.24
10093: trying file=/usr/lib/x86_64-linux-gnu/tls/haswell/libHalf-2_3.so.24
10093: trying file=/usr/lib/x86_64-linux-gnu/tls/x86_64/libHalf-2_3.so.24
10093: trying file=/usr/lib/x86_64-linux-gnu/tls/libHalf-2_3.so.24
10093: trying file=/usr/lib/x86_64-linux-gnu/haswell/x86_64/libHalf-2_3.so.24
10093: trying file=/usr/lib/x86_64-linux-gnu/haswell/libHalf-2_3.so.24
10093: trying file=/usr/lib/x86_64-linux-gnu/x86_64/libHalf-2_3.so.24
10093: trying file=/usr/lib/x86_64-linux-gnu/libHalf-2_3.so.24
10093: trying file=/lib/tls/haswell/x86_64/libHalf-2_3.so.24
10093: trying file=/lib/tls/haswell/libHalf-2_3.so.24
10093: trying file=/lib/tls/x86_64/libHalf-2_3.so.24
10093: trying file=/lib/tls/libHalf-2_3.so.24
10093: trying file=/lib/haswell/x86_64/libHalf-2_3.so.24
10093: trying file=/lib/haswell/libHalf-2_3.so.24
10093: trying file=/lib/x86_64/libHalf-2_3.so.24
10093: trying file=/lib/libHalf-2_3.so.24
10093: trying file=/usr/lib/tls/haswell/x86_64/libHalf-2_3.so.24
10093: trying file=/usr/lib/tls/haswell/libHalf-2_3.so.24
10093: trying file=/usr/lib/tls/x86_64/libHalf-2_3.so.24
10093: trying file=/usr/lib/tls/libHalf-2_3.so.24
10093: trying file=/usr/lib/haswell/x86_64/libHalf-2_3.so.24
10093: trying file=/usr/lib/haswell/libHalf-2_3.so.24
10093: trying file=/usr/lib/x86_64/libHalf-2_3.so.24
10093: trying file=/usr/lib/libHalf-2_3.so.24
10093:
./exe/my_exe: error while loading shared libraries: libHalf-2_3.so.24: cannot open shared object file: No such file or directory
Between the first and second lib, we can see that the search path from RUNPATH is greatly reduced. I imagine there's an optimization discarding all the folders that don't exist.
But then the RUNPATH is dropped (between libc.so.6 and libz.so.1) from the search. Which cause an issue down the road because libHalf-2_3.so.24 is in the lib directory relative to my_exe.
I haven't found an explanation for this behavior, and how to solve it.