You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Debian系统gd.so加载失败:查找libdav1d.so.4来源及修改方法

PHP gd.so依赖libdav1d.so.4启动异常问题分析

场景与现象

有两台服务器A和B,服务器A运行正常,服务器B出现PHP启动异常:

在服务器B执行命令:

php7.4 -d display_startup_errors=on -d display_errors=on

得到错误输出:

Warning: PHP Startup: Unable to load dynamic library 'gd.so' (tried: /usr/lib/php/20190902/gd.so (libdav1d.so.4: cannot open shared object file: No such file or directory), /usr/lib/php/20190902/gd.so.so (/usr/lib/php/20190902/gd.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0

对比两台服务器的关键信息

  • 服务器A执行上述命令无任何异常。
  • 执行lsof /usr/lib/php/20190902/gd.so:服务器A有多个php-fpm进程加载该库;服务器B无输出。
  • 两台服务器均不存在libdav1d.so.4文件,但都有libdav1d.so.6文件。
  • 执行ldd /usr/lib/php/20190902/gd.so | grep libdav:
    • 服务器A输出:
      libdav1d.so.6 => /lib/x86_64-linux-gnu/libdav1d.so.6 (0x00007fb671fbb000)
      
    • 服务器B输出:
      libdav1d.so.4 => not found
      libdav1d.so.6 => /lib/x86_64-linux-gnu/libdav1d.so.6 (0x00007fdc1402f000)
      
  • 服务器B执行ldconfig -p | grep libdav,未找到libdav1d.so.4。

问题解答

1. 服务器B从何处获取查找libdav1d.so.4的信息?能否修改该配置项?

libdav1d.so.4的依赖信息是直接嵌入在gd.so二进制文件内部的——这是编译gd.so时确定的动态链接依赖关系。当系统的动态加载器(ld.so)尝试加载gd.so时,会读取它内部的依赖列表,从而触发对libdav1d.so.4的查找。

这种嵌入在二进制文件里的依赖无法直接修改,但可以通过以下方式解决问题:

  • 创建软链接兼容:在系统库目录(如/lib/x86_64-linux-gnu/)下创建libdav1d.so.4指向现有libdav1d.so.6:
    sudo ln -s /lib/x86_64-linux-gnu/libdav1d.so.6 /lib/x86_64-linux-gnu/libdav1d.so.4
    
    注意:此方法仅适用于两个版本库API兼容的场景,若版本差异过大可能导致运行异常。
  • 替换或重新编译gd.so:从服务器A复制正常的gd.so到服务器B覆盖;或重新编译PHP的gd扩展,让它链接到当前系统的libdav1d.so.6。

内容的提问来源于stack exchange,提问作者cd4user

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 23:36:03