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
- 特点:
- 进程级别,只对当前shell以及它fork出来的子进程生效;
- root/普通用户都生效;
- 容器环境大量使用。
2. LD_PRELOAD
优先加载指定so,可覆盖系统库。
export LD_PRELOAD=/xxx/libxxx.so
3. LD_LIBRARY_PATH_32 / LD_LIBRARY_PATH_64
区分32位/64位程序的库搜索路径,较少用。
二、系统全局配置
非环境变量,ld‑linux.so内置,可以理解为固定的一些搜索路径。动态链接器内置搜索顺序(优先级从高到低):
LD_LIBRARY_PATH环境变量路径- ELF二进制里面写的 RPATH / RUNPATH(编译时写死在程序内部)
/etc/ld.so.conf+/etc/ld.so.conf.d/*.conf里面记录的目录(缓存由ldconfig生成)- 默认内置路径:
/lib、/usr/lib(64位系统/lib64/usr/lib64)
工具命令
- 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"
只确认磁盘上文件存在,不能代表链接器能找到。
浙公网安备 33010602011771号