Criando binário com objetos estáticos incluídos

0

É possível construir um binário com arquivos dependentes .so incluídos para que o binário possa ser construído uma vez e usado em máquinas com o mesmo hardware e sistema operacional, sem que eles tenham os arquivos .so?

Por exemplo, estou construindo o curl com nghttp2. Eu faço

 ./configure --with-nghttp2=/usr/local

Então eu corri make. Eu tenho o binário curl. Quando copio este binário para outra máquina e tento executá-lo, diz

./curl: error while loading shared libraries: libnghttp2.so.14: cannot open shared object file: No such file or directory

Eu também tentei executar o make da seguinte forma:

make SHARED=0 CFLAGS='-static'

Eu ainda recebo o mesmo erro.

    
por RBK 29.10.2015 / 18:47

1 resposta

1

Os arquivos Depend .so podem estar em forma de objetos compartilhados (eles são arquivos .so) ou .a arquivos também conhecidos como objetos estáticos. Você pode reconstruir o nghttp2 e passar o --disable-shared flag para o seu configure. Então você pode tentar reconfigurar e reconstruir o curl como de costume.

O ponto é ter certeza de que você tem apenas um objeto estático em / usr / local / lib para vincular o curl.

Não se esqueça de verificar que / usr / local / lib não contém a versão .so do nghttp2! (Ou você pode especificar outro --prefix = para experimentar. Você pode até instalar qualquer coisa em / tmp ou seu $ HOME e brincar com aquela árvore criada localmente)

Observe que isso não eliminará outras dependências de curl, já que é um grande projeto que depende do código de terceiros. Pode até depender de si mesmo, libcurl. Você pode passar o --disable-shared flag para construir apenas a versão estática. No final, execute readelf -d /path/to/your/curl | fgrep NEEDED para ver suas dependências completas!

    
por 30.10.2015 / 10:20