我有一个可执行文件,它依赖于两个基本的 boost 库,libboost_system
并且libboost_thread
,当可执行文件加载库时,搜索路径在以下方面令人费解地不同lib/tls
:
$ LD_DEBUG=libs ./var.exe
25130: find library=libboost_system.so.1.55.0 [0]; searching
25130: search path=/opt/boost_1_55_0/stage/lib/tls/x86_64:/opt/boost_1_55_0/stage/lib/tls:/opt/boost_1_55_0/stage/lib/x86_64:/opt/boost_1_55_0/stage/lib (RPATH from file ./var.exe)
25130: trying file=/opt/boost_1_55_0/stage/lib/tls/x86_64/libboost_system.so.1.55.0
25130: trying file=/opt/boost_1_55_0/stage/lib/tls/libboost_system.so.1.55.0
25130: trying file=/opt/boost_1_55_0/stage/lib/x86_64/libboost_system.so.1.55.0
25130: trying file=/opt/boost_1_55_0/stage/lib/libboost_system.so.1.55.0
25130:
25130: find library=libboost_thread.so.1.55.0 [0]; searching
25130: search path=/opt/boost_1_55_0/stage/lib (RPATH from file ./var.exe)
25130: trying file=/opt/boost_1_55_0/stage/lib/libboost_thread.so.1.55.0
可执行文件已与-rpath=/opt/...
两个库的完全相同的设置链接,并且我知道 boost 是通过公共调用构建的b2
(即两者的命令行参数完全相同)。/etc/ld.so.cache
没有任何相关条目。
此外,就 rpath 或 ABI 要求而言,构建的库本身似乎没有什么特别之处,
$ readelf -d /opt/boost_1_55_0/stage/lib/libboost_system.so.1.55.0 | grep -i rpath
# empty
$ eu-readelf -h /opt/boost_1_55_0/stage/lib/libboost_system.so.1.55.0
# there is no difference in ABI versions
这两个库具有完全相同的共享库依赖项,除了依赖的事实libboost_thread
,libboost_system
并且都需要 GLIBC_2.2.5。
我认为已决定以libboost_system
某种方式需要与NPTL glibc 链接,这<rpath>/lib/tls
就是搜索的原因,但对于我来说,查看libboost_system
库的 objdump 并不清楚为什么会这样。
如何标记 NPTL 库?dlopen(3) 如何决定查看 lib/tls 路径?