把一个编译好的程序拷到另一台服务器,运行直接报 error while loading shared libraries,连哪个库缺都没说。这时候 ldd 一敲,缺了什么立刻现形。

ldd 在做什么

它列出可执行文件或共享库运行时依赖的所有动态库。虽然名字像 list dynamic dependencies,实际它是个脚本,会设置环境变量让动态链接器去解析依赖,并不真正执行程序。输出里每一项后面跟着库的路径,如果某项显示 not found,那就是缺的库。

基本用法

ldd /usr/bin/nginx
ldd -r ./mytool
ldd -v /lib/x86_64-linux-gnu/libc.so.6

直接跟文件路径就行。ldd -r 会额外报告未定义的符号,能查出库在但符号对不上的情况,这个比只看 not found 更实用。ldd -v 输出更详细,包括版本需求。

和别的手段配合

  • 查缺库:not found 的库用 yum provides 或 apt-file 找出对应安装包,装上即可。
  • 看运行时加载:程序配合 LD_DEBUG=libs 能看到真实的查找过程,比 ldd 静态分析更接近实际。
  • 确认架构:file 命令看程序是 32 位还是 64 位,混装库是常见错误。

几点要小心的

ldd 在某些版本上会执行程序里的代码路径,对来路不明的二进制文件不能随便跑,官方也建议对不可信文件改用 objdump -p 或 readelf -d 看依赖。另外找不到库不一定是它不存在,也可能是 LD_LIBRARY_PATH 没包含它所在目录,或者软链接指向了不存在的文件。

export LD_LIBRARY_PATH=/opt/lib:$LD_LIBRARY_PATH

把自定义库目录加进这个变量,程序就能找到非系统路径下的库;生产环境更规范的做法是写进 /etc/ld.so.conf.d 再跑 ldconfig。

  • 判断提醒:新环境跑老程序报缺库,先 ldd 定位少哪个,再补装对应库;要是同一个库版本对不上,别硬替换系统库,装到独立目录用 LD_LIBRARY_PATH 隔离更稳。