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

20

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 bastante antigos e não são atualizados com muita frequência; meu medo é que um dia ou outro eles não funcionem mais por falta de alguma biblioteca ou atualização incompatível.

Se o programa é fácil de compilar agora , em um sistema em execução, a solução é útil: tente hackear um pouco a fonte e compilá-la estaticamente - o executável resultante será grande e não tão eficiente, mas funcionará para o futuro previsível (1). Parece ser esse o caso xfige tentarei assim que possível.

Mas, por exemplo, pdfeditdepende do Qt3, e configurar um sistema para compilá-lo é bastante complexo no momento. Felizmente, ele pode ser executado agora, graças ao fato de que a biblioteca de que precisa não entra em conflito com nada. Mas isso pode mudar no futuro, então eu gostaria de resolver este problema:

Como posso criar um binário estático (ou algo semelhante) se tenho um dinâmico e todas as bibliotecas, mas nenhum código fonte, no Ubuntu?

Eu procurei ao redor. Uma possibilidade é o statifier (2), mas há muitos problemas com a randomização de endereços , por isso é um não-não. A versão não gratuita, Ermine , parece funcionar, mas eu realmente preferiria uma opção de código aberto.

Outra possibilidade é usar o docker ou um sistema de empacotamento semelhante. Mas todo o tutorial que encontrei é bastante orientado para o RedHat ; e, honestamente, bastante complexo de 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 /programming/23498237/compile-program-for-32bit-on-64bit-linux-os-causes-fatal-error

Rmano
fonte

Respostas:

19

Você pode resolver seu problema de outra maneira e mais simples:

Use lddno 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 o 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 /etc/ld.so.conf.d/. Mas isso aplicaria a mudança em todo o sistema.

Klaus D.
fonte
Essa é uma boa idéia - embora eu realmente queira encontrar uma maneira de empacotar tudo isso em um executável; esta solução pode ser afetada por alterações no carregador (embora eu espero que ninguém faça isso de maneira não compatível com versões anteriores). Premiará a recompensa se não surgirem soluções melhores --- obrigado.
Rmano 7/11
Bem, você pode adicionar isso a um pequeno script de instalação e vinculá-lo ao caminho local. Eu gosto desta solução, poderia tê-lo usado um tempo atrás.
WalyKu
11
@ Klaus, linux-vdso.so.1 não há lugar para ser visto, suponho que esteja no kernel, correto?
Rmano
11
Sim. De man 7 vdso: "O" vDSO "(objeto compartilhado dinâmico virtual) é uma pequena biblioteca compartilhada que o kernel mapeia automaticamente no espaço de endereço de todos os aplicativos de espaço do usuário."
Klaus D.
Embora essa não seja uma resposta estrita à pergunta, é uma solução razoável. Obrigado.
Rmano
2

Uma sugestão sobre o statifier :

Se a randomização do layout do espaço de endereço (ASLR) estiver causando uma falha, você não precisará desativá-lo 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 precisa ser root).

limões
fonte
Nossa interessante. Agora, se eu só poderia compilar statifier...
Rmano
Compilado e verificado. xfig_statifiedainda lixões ... uma pena. Obrigado mesmo assim.
Rmano
Sim, uma pena. Gostaria de saber se não seria um problema de 64 bits, tente executar o statifier em uma configuração de 32 bits, talvez?
Lemonsqueeze 11/11
Verificado em uma máquina de 32 bits, ainda core dumps.
Rmano 12/11/14