找不到共享库-不在“需要”部分中,但具有间接依赖性

时间:2018-07-25 07:30:22

标签: c++ gcc shared-libraries

我有一个链接到动态库(称为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}}吗?

0 个答案:

没有答案