我这里有一个显然是静态链接的二进制文件:
$ file wkhtmltopdf-amd64
wkhtmltopdf-amd64: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux),
statically linked, stripped
$ ldd wkhtmltopdf-amd64
not a dynamic executable
$ readelf -d wkhtmltopdf-amd64
There is no dynamic section in this file.
但是当我尝试执行它时,它会抱怨共享库丢失:
$ ./wkhtmltopdf-amd64
./wkhtmltopdf-amd64: error while loading shared libraries:
libXrender.so.1: cannot open shared object file: No such file or directory
我的问题:
- 我以为静态链接二进制文件不依赖于共享库。有人能纠正我这个明显错误的假设吗?
- 我如何找到该二进制文件所依赖的所有库?
PS:有问题的二进制文件来自这里:http://code.google.com/p/wkhtmltopdf/downloads/list
答案1
是的,通过嵌入式库间接实现。
以下信息表明 QT 库是静态嵌入在二进制文件中的。使用 运行二进制文件strace
,显示它确实尝试加载 Xorg 库,因为这些库未静态链接到 QT 库中。换句话说,一些静态链接库(最有可能是 QT)有自己的依赖项。至少我是这么认为的。
在编译 wkhtmltopdf 之前,您需要安装 QT,同样,您有两个选择:您可以从发行版安装 QT,这会很快,但您的 wkhtmltopdf 构建将不具有静态构建的所有功能,或者您可以自己编译 QT,这需要很长时间,但您将获得所有功能。
wkhtmltopdf wiki - 静态(常见问题解答):
- 我使用的是静态二进制文件,但字体错误,是正方形还是全黑?
这很可能是因为您没有安装 X11 或没有安装正确的 X11 字体
QtGui 依赖于 Xorg & Co:
# qlist qtgui |grep lib.*\.so | awk -F/'{print $NF}'|column libqtiff.so libQtScriptTools.so.4 libqjpeg.so libQtDesignerComponents.so.4.8 libqico.so libQtGui.so libqgif.so libQtScriptTools.so libqimsw-multi.so libQtGui.so.4 libqtaccessiblewidgets.so libQtDesigner.so libQtDesigner.so.4.8.4 libQtDesignerComponents.so.4 libQtGui.so.4.8.4 libQtGui.so.4.8 libQtDesigner.so.4 libQtDesigner.so.4.8 libQtScriptTools.so.4.8.4 libQtScriptTools.so.4.8 libQtDesignerComponents.so.4.8.4 libQtDesignerComponents.so (>>> 取决于) # qlist qtgui |grep lib.*\.so |xargs -L1 ldd | awk '{print $1}'| sort -u|column libbz2.so.1 libpthread.so.0 libxcb.so.1 libc.so.6 libQtCore.so.4 libXcursor.so.1 libdl.so.2 libQtDesigner.so.4 libXdmcp.so.6 libexpat.so.1 libQtGui.so.4 libXext.so.6 libfontconfig.so.1 libQtScript.so.4 libXfixes.so.3 libfreetype.so.6 libQtXml.so.4 libXinerama.so.1 libgcc_s.so.1 librt.so.1 libXi.so.6 libglib-2.0.so.0 libSM.so.6 libXrandr.so.2 libICE.so.6 libstdc++.so.6 libXrender.so.1 libjpeg.so.8 libtiff.so.3 libz.so.1 /lib/ld-linux.so.2 libuuid.so.1 linux-gate.so.1 libm.so.6 libX11.so.6 libpng15.so.15 libXau.so.6
openStatic
另外,我从我的发行版(动态)的存储库编译了该程序,并且和之间的区别openDynamic
是:
# function openStatic { strace ./wkhtmltoimage/static/wkhtmltoimage-i386 \
|& grep 'open.*3' |sort | grep -o '/[^"]*' ;}
# openStatic
/etc/ld.so.cache /usr/lib/libexpat.so.1
/lib/ld-linux.so.2 /usr/lib/libfontconfig.so.1
/lib/libbz2.so.1 /usr/lib/libfreetype.so.6
/lib/libc.so.6 /usr/lib/libX11.so.6
/lib/libdl.so.2 /usr/lib/libXau.so.6
/lib/libgcc_s.so.1 /usr/lib/libxcb.so.1
/lib/libm.so.6 /usr/lib/libXdmcp.so.6
/lib/libpthread.so.0 /usr/lib/libXext.so.6
/lib/librt.so.1 /usr/lib/libXrender.so.1
/lib/libz.so.1
/usr/lib/gcc/i686-pc-linux-gnu/4.5.3/libstdc++.so.6
------ 静态嵌入库 ------ --- 动态链接依赖项 --- 1 l/ld-linux.so.2 1 ul/libk5crypto.so.3 2 /etc/ld.so.cache 1 l/libcom_err.so.2 1 ul/libkrb5.so.3 2 /lib/libbz2.so.1 1 l/libkeyutils.so.1 1 ul/libkrb5support.so.0 2 /lib/libc.so.6 1 l/libresolv.so.2 1 ul/liborc-0.4.so.0 2 /lib/libdl.so.2 1 l/libuuid.so.1 1 ul/libpng15.so.15 2 /lib/libgcc_s.so.1 1 ul/gconv/gconv-modules.cache 1 ul/libSM.so.6 2 /lib/libm.so.6 1 ul/gconv/UTF-16.so 1 ul/libsqlite3.so.0 2 /lib/libpthread.so.0 1 ul/libcrypto.so.1.0.0 1 ul/libssl.so.1.0.0 2 /lib/librt.so.1 1 ul/libffi.so.5 1 ul/libwkhtmltox.so.0 2 /lib/libz.so.1 1 ul/libglib-2.0.so.0 1 ul/libXcursor.so.1 2 ul/gcc/.../libstdc++.so.6 1 ul/libgmodule-2.0.so.0 1 ul/libXfixes.so.3 2 ul/libexpat.so.1 1 ul/libgobject-2.0.so.0 1 ul/libXinerama.so.1 2 ul/libfontconfig.so.1 1 ul/libgstapp-0.10.so.0 1 ul/libXi.so.6 2 ul/libfreetype.so.6 1 ul/libgstbase-0.10.so.0 1 ul/libxml2.so.2 2 ul/libX11.so.6 1 ul/libgstinterfaces-0.10.so.0 1 ul/libXrandr.so.2 2 ul/libXau.so.6 1 ul/libgstpbutils-0.10.so.0 1 ul/qt4/libQtCore.so.4 2 ul/libxcb.so.1 1 ul/libgstreamer-0.10.so.0 1 ul/qt4/libQtGui.so.4 2 ul/libXdmcp.so.6 1 ul/libgstvideo-0.10.so.0 1 ul/qt4/libQtNetwork.so.4 2 ul/libXext.so.6 1 ul/libgthread-2.0.so.0 1 ul/qt4/libQtSvg.so.4 2 ul/libXrender.so.1 1 ul/libICE.so.6 1 ul/qt4/libQtWebKit.so.4