问题描述
dlopen一个动态库mod_option60.so的时候,报错“libssl.so.1.0.0: cannot open shared object file: No such file or directory”
解决方法
objdump -x mod_option60.so | grep NEEDED
发现是需要这个库的。[test@localhost ]$ objdump -x mod_option60.so | grep NEEDED NEEDED libpcap.so.1 NEEDED libpthread.so.0 NEEDED librt.so.1 NEEDED libdl.so.2 NEEDED libssl.so.1.0.0 NEEDED libcrypto.so.1.0.0 NEEDED libstdc++.so.6 NEEDED libm.so.6 NEEDED libgcc_s.so.1 NEEDED libc.so.6
ldd mod_option60.so
发现在/lib64这个目录下没有找到这个库。[test@localhost ]$ ldd mod_option60.so linux-vdso.so.1 => (0x00007ffc361e1000) libpcap.so.1 => /lib64/libpcap.so.1 (0x00007f0135040000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f0134e24000) librt.so.1 => /lib64/librt.so.1 (0x00007f0134c1b000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f0134a17000) libssl.so.1.0.0 => not found libcrypto.so.1.0.0 => not found libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f013470e000) libm.so.6 => /lib64/libm.so.6 (0x00007f013440c000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f01341f5000) libc.so.6 => /lib64/libc.so.6 (0x00007f0133e27000) /lib64/ld-linux-x86-64.so.2 (0x00007f013548e000)
- 将libssl.so.1.0.0 和 libcrypto.so.1.0.0复制到/lib64的目录下,问题解决。
[test@localhost ]$ ldd mod_option60.so linux-vdso.so.1 => (0x00007fffe99f9000) libpcap.so.1 => /lib64/libpcap.so.1 (0x00007fc967626000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc96740a000) librt.so.1 => /lib64/librt.so.1 (0x00007fc967201000) libdl.so.2 => /lib64/libdl.so.2 (0x00007fc966ffd000) libssl.so.1.0.0 => /lib64/libssl.so.1.0.0 (0x00007fc966d8b000) libcrypto.so.1.0.0 => /lib64/libcrypto.so.1.0.0 (0x00007fc96693c000) libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fc966634000) libm.so.6 => /lib64/libm.so.6 (0x00007fc966332000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fc96611b000) libc.so.6 => /lib64/libc.so.6 (0x00007fc965d4d000) /lib64/ld-linux-x86-64.so.2 (0x00007fc967a74000)
动态库搜索路径顺序
1、ELF可执行文件中动态段DT_RPATH指定;gcc加入链接参数“-Wl,-rpath”
指定动态库搜索路径;
2、环境变量LD_LIBRARY_PATH
指定路径;
3、/etc/ld.so.cache
中缓存的动态库路径。可以通过修改配置文件/etc/ld.so.conf
增删路径(修改后需要运行ldconfig命令);
4、默认的 /lib/;
5、默认的 /usr/lib/