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)
- 服务器A输出:
- 服务器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:
注意:此方法仅适用于两个版本库API兼容的场景,若版本差异过大可能导致运行异常。sudo ln -s /lib/x86_64-linux-gnu/libdav1d.so.6 /lib/x86_64-linux-gnu/libdav1d.so.4 - 替换或重新编译gd.so:从服务器A复制正常的
gd.so到服务器B覆盖;或重新编译PHP的gd扩展,让它链接到当前系统的libdav1d.so.6。
内容的提问来源于stack exchange,提问作者cd4user
相关产品推荐
相关产品推荐

