Linux so动态库路径:环境变量 + 查询工具汇总

Linux so动态库路径:环境变量 + 查询工具汇总

ELF程序启动时,ld‑linux.so(动态链接器)按一套固定顺序找 .so,目标动态库文件需要在预设的路径上能找到。

一、关键环境变量

1. LD_LIBRARY_PATH(最常用,调试、容器高频)

  • 作用:优先搜索的自定义库路径,放在最前面查找。
  • 示例:
export LD_LIBRARY_PATH=/usr/local/corex-1.2.0/lib:$LD_LIBRARY_PATH
  • 特点:
    1. 进程级别,只对当前shell以及它fork出来的子进程生效;
    2. root/普通用户都生效;
    3. 容器环境大量使用。

2. LD_PRELOAD

优先加载指定so,可覆盖系统库。

export LD_PRELOAD=/xxx/libxxx.so

3. LD_LIBRARY_PATH_32 / LD_LIBRARY_PATH_64

区分32位/64位程序的库搜索路径,较少用。


二、系统全局配置

非环境变量,ld‑linux.so内置,可以理解为固定的一些搜索路径。动态链接器内置搜索顺序(优先级从高到低):

  1. LD_LIBRARY_PATH 环境变量路径
  2. ELF二进制里面写的 RPATH / RUNPATH(编译时写死在程序内部)
  3. /etc/ld.so.conf + /etc/ld.so.conf.d/*.conf 里面记录的目录(缓存由ldconfig生成)
  4. 默认内置路径:/lib/usr/lib(64位系统 /lib64 /usr/lib64

工具命令

  1. ldconfig
  • 读取 /etc/ld.so.conf.d/*.conf 目录,生成缓存文件 /etc/ld.so.cache
  • 新增库目录后必须执行 ldconfig 更新缓存;
  • -p 参数打印当前缓存里所有so映射:
ldconfig -p

三、查询so依赖/查找路径的实用工具

1. ldd 【最常用】

查看一个可执行文件需要哪些so,以及是否找到。

root@p-phy-zy-daxing-kt-tianshu-v200-node-prod-15-111:/usr/local/cuda/bin# ldd nvcc
        linux-vdso.so.1 (0x00007ffd04b2c000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f1f45b2b000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1f45902000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f1f45b3b000)

配置完LD_LIBRARY_PATH或者ldconfig之后,会显示完整路径。

注意:ldd本质会运行程序,不要在不可信二进制上执行ldd

2. objdump 读取二进制内部 RPATH / RUNPATH

有些程序编译时写死内部库路径,优先级高于系统ldconfig。

objdump -p /usr/local/corex-1.2.0/bin/ixsmi | grep -E 'RPATH|RUNPATH'
  • RPATH:编译写死路径,优先级高于LD_LIBRARY_PATH(旧)
  • RUNPATH:新版,优先级低于LD_LIBRARY_PATH

3. readelf 和 objdump 类似,读elf段

readelf -d /usr/local/corex-1.2.0/bin/ixsmi | grep -E 'RPATH|RUNPATH'

4. strace 追踪程序打开文件,看它实际去哪里找so

排查疑难问题神器,看动态链接器依次尝试哪些路径找libixml.so

strace /usr/local/corex-1.2.0/bin/ixsmi 2>&1 | grep libixml.so

会输出一堆 open("/xxx/libixml.so", O_RDONLY) = -1 ENOENT,能看到它遍历了哪些目录全部失败。

5. ld‑linux.so 直接模拟链接器查找

直接调用动态链接器,模拟搜索so:

root@p-phy-zy-daxing-kt-tianshu-v200-node-prod-15-111:/usr/local/cuda/bin# /lib64/ld-linux-x86-64.so.2 --list /usr/local/corex-1.2.0/bin/ixsmi
        linux-vdso.so.1 (0x00007fff0d9e8000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f90bbfc7000)
        libixml.so => /usr/local/corex-1.2.0/lib/libixml.so (0x00007f90bbf67000)
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f90bbd3b000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f90bbc54000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f90bbc34000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f90bbc2d000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f90bba04000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f90bbfd7000)

等价ldd,但是不走ldd包装脚本。

6. find 全盘搜索so

find /usr/local/corex-1.2.0 -name "*.so"

只确认磁盘上文件存在,不能代表链接器能找到

posted @ 2026-09-01 11:54  judesongd  阅读(11)  评论(0)    收藏  举报