Existe alguma maneira de código aberto para tornar uma estática a partir de um executável dinâmico sem disponibilidade de código-fonte?

18

Deixe-me explicar o problema com um exemplo. Eu uso algum programa antigo no meu dia-a-dia, como, por exemplo, xfig e pdfedit .

Agora, esses programas são bem antigos e não são atualizados com muita frequência; meu medo é que um dia ou outro não funcionem mais por falta de alguma biblioteca ou alguma atualização incompatível.

Se o programa é fácil de compilar agora , em um sistema em execução, a solução é útil: tente hackar um pouco o código-fonte e compilá-lo estaticamente --- o executável resultante será grande e não é tão eficiente, mas funcionará no futuro previsível (1). Este parece ser o caso de xfig e vou tentar o mais rápido possível.

Mas, por exemplo, pdfedit depende do Qt3, e configurar um sistema para compilar é bastante complexo neste momento. Felizmente, pode ser executado agora, graças ao fato de que a biblioteca necessária não conflitar com nada. Mas isso pode mudar no futuro, então eu gostaria de resolver esse problema:

Como posso criar um binário estático (ou algo similar) se eu tiver um dinâmico e todas as bibliotecas, mas sem código-fonte, no Ubuntu?

Eu procurei por aí. Uma possibilidade é o statifier (2), mas ele tem um monte de problemas com a randomização de endereços , por isso é um não-não. A versão não-livre, Arminho , parece funcionar, mas eu realmente prefiro uma opção de código aberto.

Outra possibilidade é usar o docker ou um sistema de empacotamento similar. Mas todo o tutorial que encontrei é bastante orientado para RedHat ; e, honestamente, bastante complexo para seguir.

Notas de rodapé :

(1) não é tão louco. Eu uso um ffmpeg estático por exemplo, funciona bem e sem problemas de compatibilidade ...

(2) para compilar statifier , consulte link

    
por Rmano 15.10.2014 / 20:15

2 respostas

17

Você pode resolver seu problema de uma maneira mais simples:

Use ldd no seu executável para ver as bibliotecas vinculadas, por exemplo:

$ ldd /bin/bash
linux-vdso.so.1 =>  (0x00007fffb2fd4000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fac9ef91000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fac9ed8d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fac9e9c6000)
/lib64/ld-linux-x86-64.so.2 (0x00007fac9f1e1000)

Em seguida, colete todas as bibliotecas em uma pasta e defina a variável de ambiente LD_LIBRARY_PATH antes de executar seu programa para apontar para esta pasta:

$ LD_LIBRARY_PATH="/opt/my_program/lib" /opt/my_program/start

Como alternativa, você pode adicionar uma entrada para a pasta lib em /etc/ld.so.conf.d/ . Mas isso aplicaria a mudança em todo o sistema.

    
por Klaus D. 06.11.2014 / 11:02
2

Uma sugestão sobre o statifier :

Se a randomização de layout de espaço de endereço (ASLR) estiver causando falha, não será necessário desativá-la para toda a máquina. Você pode desativá-lo apenas para esse processo:

$ setarch 'uname -m' -R statified_pdfedit [args...]

Ele executará esse comando com o layout aleatório desativado (não é necessário ser root).

    
por lemonsqueeze 09.11.2014 / 14:12