O binário estaticamente vinculado requer bibliotecas compartilhadas?

2

Eu tenho um binário aqui que aparentemente está vinculado estaticamente:

$ 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.

Mas quando tento executá-lo, ele reclama que bibliotecas compartilhadas estão ausentes:

$ ./wkhtmltopdf-amd64 
./wkhtmltopdf-amd64: error while loading shared libraries: 
   libXrender.so.1: cannot open shared object file: No such file or directory

Minhas perguntas:

  • Eu achava que binários estaticamente vinculados não dependiam de bibliotecas compartilhadas. Alguém pode corrigir minha suposição obviamente errada?
  • Como posso encontrar todas as bibliotecas em que este binário está dependendo?

PS: O binário em questão é daqui: link

    
por Nils Toedtmann 19.03.2013 / 20:06

1 resposta

1

Sim, indiretamente por meio de bibliotecas incorporadas.

As informações abaixo sugerem que a biblioteca QT está estaticamente incorporada no binário. Executar o binário com strace , revela que ele realmente tenta carregar bibliotecas Xorg porque elas não estão vinculadas estaticamente nas bibliotecas QT. Em outras palavras, algumas das bibliotecas vinculadas estaticamente (mais provavelmente QT) possuem dependências próprias. Pelo menos é o que penso.

wkhhtmltopdf wiki - compilação:

Antes de compilar o wkhtmltopdf você precisa ter o QT instalado, novamente você tem duas opções: Você pode instalar o QT da sua distribuição, isto será rápido, mas o seu wkhtmltopdf build não terá todos os recursos do build estático, ou você pode compilar seu próprio QT, isso leva muito tempo, mas você obterá todos os recursos.

wkhtmltopdf wiki - static (faq):

  • Estou usando o binário estático, mas as fontes estão erradas, quadradas ou pretas?
    Isso é mais provável porque você não tem o X11 instalado ou não as fontes X11 certas

O QtGui depende do 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

Além disso, eu compilei o programa a partir do repositório da minha distribuição (dinâmico) e as diferenças entre openStatic e openDynamic são:

# 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

mais informações:
static vinculando a sua pergunta sobre SO (duplicar, wink -wink)

    
por 21.03.2013 / 23:09