У меня есть двоичный файл, который, по-видимому, статически связан:
$ 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
Да, косвенно через встроенные библиотеки.
Приведенная ниже информация предполагает, что библиотека QT статически встроена в двоичный файл. Запуск двоичного файла с strace
, показывает, что он действительно пытается загрузить библиотеки Xorg, потому что они не связаны статически в библиотеках QT. Другими словами, некоторые из статически связанных библиотек (скорее всего, QT) имеют собственные зависимости. По крайней мере, я так думаю.
wkhhtmltopdf wiki - компиляция:
Прежде чем вы сможете скомпилировать wkhtmltopdf, вам необходимо установить QT, у вас снова есть два варианта: вы можете установить QT из своего дистрибутива, это будет быстро, но ваша сборка wkhtmltopdf не будет иметь всех функций статической сборки, или вы можете скомпилировать QT, это займет много времени, но вы получите все возможности.
wkhtmltopdf wiki - статика (часто задаваемые вопросы):
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 (>>> depend on) # 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
------ Statically embedded libraries ------ --- Dynamically linked dependencies --- 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
больше информации:
статическое связывание
ваш вопрос по SO (дубликат, подмигивание)