Mantendo um único binário nas distribuições Debian

0

No momento, estamos migrando nosso sistema do Debian 6 para o 8. A agenda é tentar manter um único binário em todas as plataformas do sistema operacional (x86)

No entanto, eu tentei executar um binário compilado com o Debian 8 no Debian 6. Isso resultou em

symbol lookup error : g_thread_create

Eu tentei a compilação oposta, e uma aplicação Debian 6 compilada é executada no Debian 8.

As plataformas de destino são x86 placas Atom.

Debian 8 ldd mostra:

linux-gate.so.1 (0xb76f5000)
libusb-1.0.so.0 => /lib/i386-linux-gnu/libusb-1.0.so.0 (0xb76c7000)
libpthread.so.0 => /lib/i386-linux-gnu/i686/cmov/libpthread.so.0 (0xb76ab000)
librt.so.1 => /lib/i386-linux-gnu/i686/cmov/librt.so.1 (0xb76a1000)
libUFScanner.so => /usr/lib/libUFScanner.so (0xb751a000)
libUFMatcher.so => /usr/lib/libUFMatcher.so (0xb74f1000)
libjpeg.so.62 => /usr/lib/i386-linux-gnu/libjpeg.so.62 (0xb7492000)
libsqlite3.so.0 => /usr/lib/i386-linux-gnu/libsqlite3.so.0 (0xb73b9000)
libxml2.so.2 => /usr/lib/i386-linux-gnu/libxml2.so.2 (0xb7237000)
libX11.so.6 => /usr/lib/i386-linux-gnu/libX11.so.6 (0xb70e5000)
libssl.so.0.9.8 => /usr/lib/i686/cmov/libssl.so.0.9.8 (0xb7099000)
libcrypto.so.0.9.8 => /usr/lib/i686/cmov/libcrypto.so.0.9.8 (0xb6f41000)
libmorphosdk.so.6 => /usr/lib/libmorphosdk.so.6 (0xb6f1e000)
libMSO100.so.6 => /usr/lib/libMSO100.so.6 (0xb6f0e000)
libMSO_Drv.so.6 => /usr/lib/libMSO_Drv.so.6 (0xb6f06000)
libgtk-x11-2.0.so.0 => /usr/lib/i386-linux-gnu/libgtk-x11-2.0.so.0 (0xb6a0e000)
libgdk-x11-2.0.so.0 => /usr/lib/i386-linux-gnu/libgdk-x11-2.0.so.0 (0xb694d000)
libatk-1.0.so.0 => /usr/lib/i386-linux-gnu/libatk-1.0.so.0 (0xb6925000)
libgdk_pixbuf-2.0.so.0 => /usr/lib/i386-linux-gnu/libgdk_pixbuf-2.0.so.0 (0xb68fc000)
libpangocairo-1.0.so.0 => /usr/lib/i386-linux-gnu/libpangocairo-1.0.so.0 (0xb68ee000)
libpango-1.0.so.0 => /usr/lib/i386-linux-gnu/libpango-1.0.so.0 (0xb689c000)
libcairo.so.2 => /usr/lib/i386-linux-gnu/libcairo.so.2 (0xb6753000)
libgobject-2.0.so.0 => /usr/lib/i386-linux-gnu/libgobject-2.0.so.0 (0xb66f5000)
libgmodule-2.0.so.0 => /usr/lib/i386-linux-gnu/libgmodule-2.0.so.0 (0xb66ef000)
libdl.so.2 => /lib/i386-linux-gnu/i686/cmov/libdl.so.2 (0xb66ea000)
libglib-2.0.so.0 => /lib/i386-linux-gnu/libglib-2.0.so.0 (0xb65c2000)
libgthread-2.0.so.0 => /usr/lib/i386-linux-gnu/libgthread-2.0.so.0 (0xb65bf000)
libftd2xx.so => /usr/lib/i386-linux-gnu/libftd2xx.so (0xb657c000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb648a000)
libm.so.6 => /lib/i386-linux-gnu/i686/cmov/libm.so.6 (0xb6444000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb6427000)
libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xb627d000)
libudev.so.1 => /lib/i386-linux-gnu/libudev.so.1 (0xb626a000)
/lib/ld-linux.so.2 (0xb76f8000)
libusb-0.1.so.4 => /lib/i386-linux-gnu/libusb-0.1.so.4 (0xb6260000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb6243000)
liblzma.so.5 => /lib/i386-linux-gnu/liblzma.so.5 (0xb621a000)
libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xb61f4000)
libXcomposite.so.1 => /usr/lib/i386-linux-gnu/libXcomposite.so.1 (0xb61ef000)
libXdamage.so.1 => /usr/lib/i386-linux-gnu/libXdamage.so.1 (0xb61eb000)
libXfixes.so.3 => /usr/lib/i386-linux-gnu/libXfixes.so.3 (0xb61e4000)
libgio-2.0.so.0 => /usr/lib/i386-linux-gnu/libgio-2.0.so.0 (0xb602e000)
libpangoft2-1.0.so.0 => /usr/lib/i386-linux-gnu/libpangoft2-1.0.so.0 (0xb6016000)
libfontconfig.so.1 => /usr/lib/i386-linux-gnu/libfontconfig.so.1 (0xb5fd3000)
libfreetype.so.6 => /usr/lib/i386-linux-gnu/libfreetype.so.6 (0xb5f22000)
libXrender.so.1 => /usr/lib/i386-linux-gnu/libXrender.so.1 (0xb5f16000)
libXinerama.so.1 => /usr/lib/i386-linux-gnu/libXinerama.so.1 (0xb5f12000)
libXi.so.6 => /usr/lib/i386-linux-gnu/libXi.so.6 (0xb5eff000)
libXrandr.so.2 => /usr/lib/i386-linux-gnu/libXrandr.so.2 (0xb5ef2000)
libXcursor.so.1 => /usr/lib/i386-linux-gnu/libXcursor.so.1 (0xb5ee6000)
libXext.so.6 => /usr/lib/i386-linux-gnu/libXext.so.6 (0xb5ed1000)
libpng12.so.0 => /lib/i386-linux-gnu/libpng12.so.0 (0xb5ea4000)
libthai.so.0 => /usr/lib/i386-linux-gnu/libthai.so.0 (0xb5e9a000)
libpixman-1.so.0 => /usr/lib/i386-linux-gnu/libpixman-1.so.0 (0xb5de0000)
libxcb-shm.so.0 => /usr/lib/i386-linux-gnu/libxcb-shm.so.0 (0xb5ddc000)
libxcb-render.so.0 => /usr/lib/i386-linux-gnu/libxcb-render.so.0 (0xb5dd1000)
libffi.so.6 => /usr/lib/i386-linux-gnu/libffi.so.6 (0xb5dc9000)
libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0xb5d58000)
libXau.so.6 => /usr/lib/i386-linux-gnu/libXau.so.6 (0xb5d53000)
libXdmcp.so.6 => /usr/lib/i386-linux-gnu/libXdmcp.so.6 (0xb5d4d000)
libselinux.so.1 => /lib/i386-linux-gnu/libselinux.so.1 (0xb5d25000)
libresolv.so.2 => /lib/i386-linux-gnu/i686/cmov/libresolv.so.2 (0xb5d0e000)
libharfbuzz.so.0 => /usr/lib/i386-linux-gnu/libharfbuzz.so.0 (0xb5cb1000)
libexpat.so.1 => /lib/i386-linux-gnu/libexpat.so.1 (0xb5c87000)
libdatrie.so.1 => /usr/lib/i386-linux-gnu/libdatrie.so.1 (0xb5c7e000)
libgraphite2.so.3 => /usr/lib/i386-linux-gnu/libgraphite2.so.3 (0xb5c62000)

Debian 6 ldd mostra:

linux-gate.so.1 =>  (0xb7757000)
libusb-1.0.so.0 => /lib/libusb-1.0.so.0 (0xb773a000)
libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb7721000)
librt.so.1 => /lib/i686/cmov/librt.so.1 (0xb7717000)
libUFScanner.so => /usr/lib/libUFScanner.so (0xb7590000)
libUFMatcher.so => /usr/lib/libUFMatcher.so (0xb7567000)
libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0xb7547000)
libsqlite3.so.0 => /usr/lib/libsqlite3.so.0 (0xb74bb000)
libxml2.so.2 => /usr/lib/libxml2.so.2 (0xb7390000)
libX11.so.6 => /usr/lib/libX11.so.6 (0xb7273000)
libssl.so.0.9.8 => /usr/lib/i686/cmov/libssl.so.0.9.8 (0xb7227000)
libcrypto.so.0.9.8 => /usr/lib/i686/cmov/libcrypto.so.0.9.8 (0xb70cf000)
libmorphosdk.so.6 => /usr/lib/libmorphosdk.so.6 (0xb70ac000)
libMSO100.so.6 => /usr/lib/libMSO100.so.6 (0xb709d000)
libMSO_Drv.so.6 => /usr/lib/libMSO_Drv.so.6 (0xb7094000)
libgtk-x11-2.0.so.0 => /usr/lib/libgtk-x11-2.0.so.0 (0xb6d09000)
libgdk-x11-2.0.so.0 => /usr/lib/libgdk-x11-2.0.so.0 (0xb6c82000)
libatk-1.0.so.0 => /usr/lib/libatk-1.0.so.0 (0xb6c66000)
libgdk_pixbuf-2.0.so.0 => /usr/lib/libgdk_pixbuf-2.0.so.0 (0xb6c4d000)
libpangocairo-1.0.so.0 => /usr/lib/libpangocairo-1.0.so.0 (0xb6c41000)
libpango-1.0.so.0 => /usr/lib/libpango-1.0.so.0 (0xb6bfd000)
libcairo.so.2 => /usr/lib/libcairo.so.2 (0xb6b88000)
libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0xb6b4a000)
libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0xb6b46000)
libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb6b41000)
libglib-2.0.so.0 => /lib/libglib-2.0.so.0 (0xb6a78000)
libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0xb6a73000)
libftd2xx.so => /usr/lib/libftd2xx.so (0xb6a31000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb693b000)
libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb6915000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb68f7000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb67b0000)
/lib/ld-linux.so.2 (0xb775a000)
libusb-0.1.so.4 => /lib/libusb-0.1.so.4 (0xb67a8000)
libz.so.1 => /usr/lib/libz.so.1 (0xb6793000)
libxcb.so.1 => /usr/lib/libxcb.so.1 (0xb677a000)
libXcomposite.so.1 => /usr/lib/libXcomposite.so.1 (0xb6777000)
libXdamage.so.1 => /usr/lib/libXdamage.so.1 (0xb6774000)
libXfixes.so.3 => /usr/lib/libXfixes.so.3 (0xb676f000)
libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0xb673f000)
libXext.so.6 => /usr/lib/libXext.so.6 (0xb6730000)
libXrender.so.1 => /usr/lib/libXrender.so.1 (0xb6727000)
libXinerama.so.1 => /usr/lib/libXinerama.so.1 (0xb6724000)
libXi.so.6 => /usr/lib/libXi.so.6 (0xb6716000)
libXrandr.so.2 => /usr/lib/libXrandr.so.2 (0xb670e000)
libXcursor.so.1 => /usr/lib/libXcursor.so.1 (0xb6705000)
libgio-2.0.so.0 => /usr/lib/libgio-2.0.so.0 (0xb6669000)
libpangoft2-1.0.so.0 => /usr/lib/libpangoft2-1.0.so.0 (0xb6643000)
libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0xb65cb000)
libpixman-1.so.0 => /usr/lib/libpixman-1.so.0 (0xb6572000)
libpng12.so.0 => /lib/libpng12.so.0 (0xb654d000)
libxcb-render-util.so.0 => /usr/lib/libxcb-render-util.so.0 (0xb6549000)
libxcb-render.so.0 => /usr/lib/libxcb-render.so.0 (0xb6542000)
libpcre.so.3 => /lib/libpcre.so.3 (0xb650f000)
libXau.so.6 => /usr/lib/libXau.so.6 (0xb650c000)
libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0xb6506000)
libexpat.so.1 => /usr/lib/libexpat.so.1 (0xb64e0000)
libresolv.so.2 => /lib/i686/cmov/libresolv.so.2 (0xb64cc000)
libselinux.so.1 => /lib/libselinux.so.1 (0xb64b1000)
    
por Ragav 30.03.2016 / 12:44

1 resposta

5

Como foi dito nos comentários, a única maneira confiável de construir um único binário que funcionará em diferentes versões do Debian (ou qualquer distribuição do Linux) é compilá-lo estaticamente. Isso é bem suportado no Debian e em outros lugares, inclusive com pkg-config etc. Os binários estáticos podem continuar funcionando por décadas; a interface do userspace do kernel é mantida de forma compatível com versões anteriores (às vezes, ela é interrompida, mas isso é considerado um bug e geralmente corrigido rapidamente). Você encontrará casos em que os binários estáticos param de funcionar, mas isso geralmente está relacionado a libnss handling (isso é dinâmico mesmo em binários estáticos) ou a mudanças nas expectativas do servidor X (isso acontece com jogos Linux antigos ), ou núcleos de distribuição eliminando o suporte para recursos considerados obsoletos ( por exemplo a interface de som OSS em kernels Ubuntu).

(Outra abordagem é enviar todas as suas bibliotecas dependentes e usar rpath ou um shell script para configurar as coisas corretamente; isso é o que o Steam faz, e muitos jogos Linux que não são Steam fazem isso também, mas é menos futuro prova de ligação estática e é mais difícil de corrigir quando as coisas dão errado.)

Seu binário dinâmico embutido no Debian 6 funciona no Debian 8 porque as dependências diretas do binário ainda estão disponíveis em sua instalação do Debian 8; isso é pura sorte e não é algo em que você possa confiar. Por exemplo, seu binário está vinculado a libssl.so.0.9.8 ; que ainda funciona para você no Debian 8, porque você ainda tem o antigo pacote libssl0.9.8 (note que o link é satisfeito por /usr/lib/i686/cmov/libssl.so.0.9.8 , que não usa um caminho multiarch e presumivelmente vem de um pacote antigo). Baseando-se no Debian 8 sem pacotes antigos, você acabaria com um link para libssl.so.1.0.0 , e isso não está disponível na Debian 6. (Esta é a situação na qual você terminaria com um Debian 8 recém-instalado. sistema.)

Seu binário construído em Debian 8 não funciona no Debian 6, e isso é perfeitamente normal: a compatibilidade binária é apenas crescente, não decrescente. Isto significa que se você construir um binário no Debian 6, e ele ainda encontrar suas bibliotecas no Debian 8, então ele deve funcionar bem; mas um binário ligado no Debian 8 pode esperar símbolos em bibliotecas que não estão disponíveis no Debian 6, sem uma mudança nos sons das bibliotecas. O erro que você recebe em relação a g_thread_create acontece porque você construiu no Debian 8, onde libglib-2.0.so.0 tem esse símbolo, mas libglib-2.0.so.0 do Debian 6 não. Se você construísse um pacote contendo seu binário, as dependências do pacote o identificariam corretamente (você obteria uma dependência de pelo menos libglib2.0-0 (>= 2.31.8) ; o Debian 6 teria apenas a versão 2.24.2).

A melhor maneira de preparar sua configuração para o futuro é produzir um pacote fonte com dependências que possam ser satisfeitas no Debian 6 e 8; então você pode facilmente construir pacotes binários corretos para o Debian 6, 7, 8, 9 ... Isso é um pouco mais complicado do que construir um binário estático, pelo menos nas primeiras vezes que você faz isso, mas eu acho que vale a pena execute se você planeja fazer esses tipos de atualizações no futuro. Normalmente você usaria pbuilder para isso, ele suporta construção de várias distribuições ( sbuild também pode fazer isso). Estender as instruções que eu coloquei lá para o Debian 6 deve ser relativamente fácil (duplique o STABLE_CODENAME handling para OLDOLDSTABLE_CODENAME e use os repositórios de arquivos ).

    
por 31.03.2016 / 09:12

Tags