linux下找不到动态库的解决方案

问题描述

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/

Tags: problems
Share: X (Twitter) Facebook LinkedIn