Esta resposta foi escrita pela primeira vez para a questão mais geral "meu binário será executado em todas as distros", mas trata de binários estaticamente vinculados no segundo semestre.
Para qualquer coisa que seja mais complexa do que um mundo hello vinculado estaticamente, a resposta é provavelmente não . Sem testá-lo na distribuição X, assuma que a resposta é não para X.
Se você quiser enviar seu software em formato binário, restrinja-se a
-
algumas distribuições populares para o campo de uso de seu software (desktop, servidor, incorporado, ...)
-
a última ou duas versões de cada
Caso contrário, você acabará com centenas de distribuições de todos os tamanhos, versões e idades (as distribuições de dez anos ainda estão em uso e suportadas).
Teste para eles. Apenas alguns apontamentos sobre o que pode (e vai) dar errado de outra forma:
-
O pacote de uma ferramenta / biblioteca que você precisa tem um nome diferente nas distribuições e até nas versões da mesma distribuição
-
As bibliotecas de que você precisa são muito novas ou antigas (versão incorreta). Não assuma apenas porque o seu programa pode vincular, ele se vincula à biblioteca certa.
-
A mesma biblioteca (arquivo no disco) é nomeada de forma diferente em distribuições diferentes, tornando a vinculação impossível
-
32 bits em 64 bits: o ambiente de 32 bits pode não estar instalado ou uma biblioteca não essencial de 32 bits é movida para um pacote extra além do ambiente 32on64, portanto você tem uma dependência extra apenas para este caso.
-
Shell: não assuma sua versão do Bash. Não assuma nem Bash.
-
Ferramentas: não assuma que alguma ferramenta de linha de comando não POSIX existe em qualquer lugar.
-
Ferramentas: não assuma que a ferramenta reconheça uma opção apenas porque a versão GNU de sua distribuição faz.
-
Interfaces do kernel: não assuma a existência ou estrutura de arquivos em
/proc
apenas porque eles existem / têm a estrutura em sua máquina -
Java: você tem certeza de que seu programa é executado no JRE da IBM fornecido com o SLES sem testá-lo?
Bônus:
- Conjuntos de instruções: o binário compilado em sua máquina não é executado em hardware mais antigo.
A vinculação estática (ou: agrupar todas as bibliotecas necessárias com o software) é uma solução? Mesmo que funcione tecnicamente, os custos associados podem ser altos. Então, infelizmente, a resposta provavelmente não é nenhuma delas.
-
Segurança: você muda a responsabilidade de atualizar as bibliotecas do usuário do seu software para si mesmo.
-
Tamanho e complexidade: apenas por diversão, tente criar um programa GUI vinculado estaticamente.
-
Interoperabilidade: se o seu software é um "plugin" de qualquer tipo, você depende do software que o chama.
-
Design da biblioteca: se você vincular seu programa estaticamente ao GNU libc e usar serviços de nomes (
getpwnam()
etc.), você será vinculado dinamicamente ao NSS (switch de serviço de nome) da libc. -
Design da biblioteca: a biblioteca que você vincula estaticamente ao seu programa usa arquivos de dados ou outros recursos (como fusos horários ou localidades).
Por todas as razões mencionadas acima, o teste é essencial.
-
Familiarize-se com o KVM ou outras técnicas de virtualização e tenha uma VM com todas as distribuições que você pretende suportar. Teste seu software em todas as VMs.
-
Use instalações mínimas dessas distribuições.
-
Crie uma VM com um conjunto de instruções restritas (por exemplo, sem SSE 4).
-
Vinculado estatisticamente ou somente em pacote: verifique seus binários com
ldd
para ver se eles estão realmente vinculados estaticamente / usam somente as bibliotecas que você agrupa. -
Vinculado estaticamente ou somente agrupado: crie um diretório vazio e copie o software para ele.
chroot
nesse diretório e execute seu software.