Hebang
(usa Arch Linux)
Enviado em 24/10/2011 - 17:20h
Olá pessoal!
Venho aqui perguntar algo que há muito (mas muito tempo mesmo) tento encontrar uma solução porém, pelo fato de não obter sucesso em meus testes, acabo postergando uma solução definitiva.
Eis a questão: haveria uma forma de fazer uma linkagem onde eu possa levar TODAS as biblotecas necessárias para meu programa rodar?
Eis minhas tentativas:
1) Linkagem estática (com -static e -static-libgcc).
Essa solução parecia ter tudo para resolver o problema, mas volta e meia ocorre de o programa não rodar em certas máquinas por falta de bibliotecas, sinal que o estático não é realmente estático. Além do mais, algumas chamadas de sistemas não podem ser compiladas estaticamente (setuid e setgid sempre me causam warning sobre isso);
2) Carregar as bibliotecas junto.
Nessa solução, eu compilei o meu programa dinamicamente (maneira default) e, após compilado, rodo o ldd sobre o executavel para ver as bibliotecas utilizadas. Feito isso, copio todas as bibliotecas que o ldd acusou em um diretório e 'seto' o LD_LIBRARY_PATH para procurar primeiro nesse diretório por bibliotecas. O erro que ocorre algumas várias vezes é referente a versão do GLIBC (mas que diabos, a GLIBC que está apontada pelo LD_LIBRARY_PATH como primeira opcao é a utilizada na compilacao!!!)
3) Compilar em distros antigas.
Meu último teste foi compilar meu código dinamicamente em uma distro Linux bem antiga (CentOS 4.8). Minha esperança é que, pelo fato de se tratar de uma distro antiga, as maquinas mais novas aceitariam o binário sem problemas por causa da retrocompatibilidade.
Na maioria dos casos é isso que ocorre mesmo, porém em alguns casos ocorre o mesmo problema do item 2: erro na versão do GLIBC, mesmo a distro em que estou rodando meu código sendo bem mais nova que o CentOS 4.8 que uso para compilar meu código.
Geralmente os erros supra citados ocorrem em ambientes Redhat.
Por fim, fica a dúvida:
Existe uma maneira realmente eficiente de linkar as bibliotecas em um código, de forma que rode em qualquer distro linux? Algo tipo o que o Visual Studio faz no Windows quando gera um MSI de instalação: todas as bibliotecas necessárias são carregadas junto no MSI e, até o momento, nunca tive problemas de dependências quebradas.
Bom, era isso.
Desde já, fico grato por qualquer sugestão e/ou comentário a respeito do assunto.
Abraço a todos!