Назад | Перейти на главную страницу

Могут ли статически скомпонованные двоичные файлы требовать общих библиотек?

У меня есть двоичный файл, который, по-видимому, статически связан:

$ 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 - статика (часто задаваемые вопросы):

  • Я использую статический двоичный файл, но шрифты неправильные, квадратные или все черные?
    Скорее всего, это связано с тем, что у вас не установлен 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

       (>>> 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 (дубликат, подмигивание)