ldconfig 命令详解
更新时间:2026-09-17。「一个命令一个文档」系列,属于开发构建与二进制族。手动往
/usr/local/lib放了个.so,程序却报error while loading shared libraries: libxxx.so: cannot open shared object file——多半是没跑 ldconfig。
程序运行时由动态链接器 ld-linux.so 按缓存/路径找 .so。ldconfig 负责扫描受信目录,生成 /etc/ld.so.cache(库名→路径的快速索引)。
一、常用法
bash
sudo ldconfig # 按 /etc/ld.so.conf 重新扫描并刷新缓存(装库后执行)
sudo ldconfig /usr/local/lib # 额外扫描该目录并更新缓存
ldconfig -p # 打印当前缓存里的所有库(查某库在不在)
ldconfig -p | grep libssl
ldconfig -v # 显示扫描过程与识别到的库(排障)
ldconfig -n /opt/mylibs # 只处理命令行给的目录,不处理可信目录、不更新缓存二、库搜索的几条路径(按优先级理解)
- 二进制 DT_RPATH / DT_RUNPATH(编译时写死,
-Wl,-rpath)。 - 环境变量
LD_LIBRARY_PATH(临时、按进程,生产慎用)。 /etc/ld.so.cache(由 ldconfig 依据下面配置生成)。- 默认目录
/lib、/usr/lib(64 位还有/lib64、/usr/lib64)。
配置来源:/etc/ld.so.conf 通常只一行 include /etc/ld.so.conf.d/*.conf,各软件往 ld.so.conf.d/ 丢一个写着自己 lib 目录的 .conf。
bash
echo /opt/app/lib | sudo tee /etc/ld.so.conf.d/app.conf
sudo ldconfig三、典型场景与坑
- 装了自定义库找不到:加
.conf或放标准目录后务必sudo ldconfig,否则缓存里没有。 - ldd 显示 not found:路径没进缓存或库的 SONAME 版本不符;先
ldconfig -p | grep验证。 - 版本/SONAME:ldconfig 还会维护
libfoo.so.1 -> libfoo.so.1.2.3这种符号链接,依据 ELF 的 SONAME;只拷libfoo.so开发软链(无版本号)运行时未必匹配。 - 别滥用 LD_LIBRARY_PATH:它对该进程的所有子进程生效、可能劫持系统库;持久、系统级的正确做法是 ld.so.conf.d + ldconfig。
- 安全:ldconfig 只信任 root 管理的目录和缓存;
LD_LIBRARY_PATH对 setuid 程序会被忽略以防提权。不要把可写目录加入全局搜索路径,否则可能被用来注入恶意库。
相关命令
查看二进制依赖用 ldd,看符号/ELF 用 nm/readelf/objdump 概念,静态/动态库区别见 C 语言专家篇静态动态库,构建链见 [gcc/cmake] 相关文档。
总结
ldconfig 扫描受信库目录、生成 /etc/ld.so.cache 供动态链接器快速找 .so:装库/加目录后必须 sudo ldconfig,-p 查缓存、-v 看过程;目录通过 /etc/ld.so.conf.d/*.conf 持久声明,临时调试才用 LD_LIBRARY_PATH;它还按 SONAME 维护版本软链,找不到库先 ldconfig -p 核对,并避免把可写目录加入全局路径带来注入风险。