我有一个链接到动态库(称为libester_timing.so
)的可执行文件,而动态库又链接到另一个共享库(libester_patternset.so
)。但是我的可执行文件仅使用libester_timing.so
的某些部分,这些部分不依赖libester_patternset.so
。因此,libester_patternset.so
不属于我的可执行文件的ELF动态部分中的NEEDED部分:
0x0000000000000001 (NEEDED) Shared library: [libdate_tools.so]
0x0000000000000001 (NEEDED) Shared library: [libester_timing.so]
0x0000000000000001 (NEEDED) Shared library: [libester_circuit.so]
0x0000000000000001 (NEEDED) Shared library: [libester_bitlogic.so]
0x0000000000000001 (NEEDED) Shared library: [libester_utilities.so]
0x0000000000000001 (NEEDED) Shared library: [libboost_system.so.1.65.1]
0x0000000000000001 (NEEDED) Shared library: [libboost_filesystem.so.1.65.1]
0x0000000000000001 (NEEDED) Shared library: [libboost_unit_test_framework.so.1.65.1]
0x0000000000000001 (NEEDED) Shared library: [libboost_log.so.1.65.1]
0x0000000000000001 (NEEDED) Shared library: [libpthread.so.0]
0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6]
0x0000000000000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
相应地,ldd
给了我
libester_patternset.so => not found
请注意,所有libester_*
库都位于同一文件夹(不在LD_LIBRARY_PATH
中),对于所有需要的库,ldd
会正确返回该文件夹。
现在,如果我调用可执行文件,则会出现“无法打开共享对象文件” 错误。如果我将代码插入可执行文件中,该问题就会消失,该可执行文件会从libester_patternset.so
库中调用函数(即使从未执行过代码)。
(目前)我的理解是加载器加载libester_timing.so
,它需要libester_patternset.so
,但是现在不使用可执行文件的RUNPATH
(或RPATH
) ,但改用LD_LIBRARY_PATH
-实际上,如果我相应地修改LD_LIBRARY_PATH
,问题就消失了。那是对的吗?我该如何解决这个问题?这两种解决方案(添加不必要的代码或调整LD_LIBRARY_PATH
)对我来说似乎都是“ hacky” 。我需要修改libester_timing.so
的{{1}}吗?