Meu binário linux funcionará em todas as distros?


24

Encontrei um bom IDE substituto para o Delphi chamado Lazarus. Mas não tenho uma pergunta para programadores.

O binário Linux vinculado estaticamente funcionará em todas as distribuições Linux? Ou seja, não importa em qual distro Linux eu o construí e funcionará no Debian / ArchLinux / Ubuntu / OpenSUSE / ... o que seja?

Como resultado das minhas descobertas, realmente importa apenas 32 bits vs 64 bits? Quero ter certeza antes de publicar.



Você pode ser mais específico sobre com que tipo de bibliotecas você planeja vincular seu programa? Algumas bibliotecas possuem dependências ocultas (arquivos de dados, subsistemas dinâmicos) ou suposições implícitas sobre o sistema em que estão executando.
Thomas Erker

Respostas:


29

Esta resposta foi escrita pela primeira vez para a pergunta mais geral "meu binário será executado em todas as distros", mas aborda binários estaticamente vinculados no segundo semestre.


Para qualquer coisa que seja mais complexa do que um olá estaticamente vinculado, a resposta é provavelmente não .
Sem testá-lo na distribuição X, suponha que a resposta seja não para X.

Se você deseja enviar seu software em formato binário, restrinja-se a

  • algumas distribuições populares para o campo de uso do seu software (desktop, servidor, incorporado, ...)

  • as uma ou duas versões mais recentes de cada

Caso contrário, você terá centenas de distribuições de todos os tamanhos, versões e idades (a distribuição com dez anos ainda está em uso e é suportada).

Teste para aqueles. Apenas algumas dicas sobre o que pode (e vai) dar errado de outra forma:

  • O pacote de uma ferramenta / biblioteca de que você precisa é nomeado de maneira diferente nas distribuições e até nas versões da mesma distribuição.

  • As bibliotecas necessárias são muito novas ou muito antigas (versão incorreta). Não presuma que apenas porque seu programa pode vincular, ele vincula à biblioteca certa.

  • A mesma biblioteca (arquivo em disco) tem nomes diferentes em diferentes distribuições, impossibilitando a vinculação

  • 32 bits em 64 bits: o ambiente de 32 bits pode não estar instalado ou alguma biblioteca de 32 bits não essencial é movida para um pacote extra além do ambiente de 32on64, portanto, você tem uma dependência extra apenas para esse caso.

  • Shell: não assuma a sua versão do Bash. Não assuma nem Bash.

  • Ferramentas: não assuma que alguma ferramenta de linha de comando não POSIX exista em qualquer lugar.

  • Ferramentas: não assuma que a ferramenta reconhece uma opção apenas porque a versão GNU da sua distribuição o faz.

  • Interfaces do kernel: não assuma a existência ou a estrutura dos arquivos /procapenas 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 roda em hardware mais antigo.

Está ligando estaticamente (ou: agregação de todas as bibliotecas que você precisa com o seu software) uma solução? Mesmo que funcione tecnicamente, os custos associados podem ser altos. Infelizmente, a resposta provavelmente também não.

  • 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 for um "plugin" de qualquer tipo, você depende do software que o chama.

  • Design da biblioteca: se você vincula estaticamente o programa ao GNU libc e usa os serviços de nome ( getpwnam()etc.), acaba vinculado dinamicamente ao NSS da libc (switch de serviço de nome).

  • Design da biblioteca: a biblioteca à qual você vincula estaticamente o 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 de cada distribuição que você planeja oferecer suporte. Teste seu software em todas as VMs.

  • Use instalações mínimas dessas distribuições.

  • Crie uma VM com um conjunto de instruções restrito (por exemplo, sem SSE 4).

  • Somente vinculado estaticamente ou empacotado: verifique seus binários lddpara ver se eles estão realmente vinculados estaticamente / use apenas suas bibliotecas empacotadas.

  • Somente vinculado ou empacotado estaticamente: crie um diretório vazio e copie seu software nele. chrootnesse diretório e execute seu software.


Essa é uma resposta bastante abrangente +1
sirlark

2
Shell: Em particular, o Debian não usa bash , e como isso mitigou bastante a vulnerabilidade do Shellshock nos sistemas Debian, não consigo imaginá-lo mudar no futuro imediato.
Kevin

11
Além disso, se você quiser enviar binários, vincule-os estaticamente .
User253751

Por que o "conjunto de instruções" é chamado de "bônus"? Se você distribuir em formato binário, realmente precisará considerar para quais ISAs estará compilando. Você pode não gostar dos usuários do m68k, mas é difícil ignorar o ARM, IA32 e X86_64 pelo menos.
perfil completo de Toby Speight

@TobySpeight Pense no SSE4 e tal. Só pode te morder se você usar o assembler.
Thomas Erker

9

A resposta é que depende. , mas na maioria dos casos, sim, desde que as bibliotecas necessárias estejam instaladas no sistema operacional.

Geralmente, a maioria das distros importantes, como as mencionadas, possui suas ferramentas de gerenciamento de pacotes que instalam a versão mantida pela comunidade do aplicativo. Isso cuida de todos os pacotes de pré-requisitos necessários ao aplicativo. Se você estiver instalando sem um gerenciador de pacotes, é sua responsabilidade garantir que todos os pacotes e bibliotecas necessários estejam instalados no sistema operacional. É uma boa ideia incluir uma lista desses aplicativos de pré-requisito na documentação.


2

Resposta de baixa qualidade primeiro: depende

Se você estiver liberando binários, suponha que a resposta seja "não", a menos que você esteja distribuindo todas as bibliotecas que ela envolve (desde o início, o que é irritante, a menos que você esteja fornecendo um sistema realmente grande que se mantém independente de qualquer maneira ) ou estão vinculando estaticamente o equivalente.

... mas assistentes e dinheiro, e assistentes de dinheiro ...

A IBM tem alguns instaladores "Unixish gerais" que me chocaram trabalhando em todos os lugares em que os experimentei: vários Linuces de várias gerações de kernel, OpenSolaris (ou como é chamado agora), Solaris e BSD. Mas eles são enormes. E as coisas que eles fornecem são igualmente enormes. Nenhum pequeno programa de carro de corrida é publicado dessa maneira, apenas as grandes coisas do tipo empreendedor que você esperaria da IBM.

No que diz respeito a permanecer no Linux, mas funcionando bem na maioria dos Linuxdom, isso parece ser possível na forma binária, como evidenciado pela variedade de instaladores binários do tipo "para Linux (geral)" que você verá em alguns fornecedores. Vários bate-papos, navegadores, jogos, meta-instaladores etc. são publicados dessa maneira, mas sempre por grandes fornecedores que podem gastar o tempo para acertar. É incrível que eles possam dizer "para Linux" e estar confiantes de que funcionará, mas parece ser esse o caso.

Mas...

Eu distribuo meu software como fonte com um utilitário de compilação. Faço isso em C, Erlang, Python, Guile etc. Isso me dá muito mais flexibilidade sobre a execução ou não da execução, e é muito mais fácil escrever um buildscript que garanta que as coisas certas existam no momento da construção do que verifique se tudo está no lugar no tempo de execução. Uma vez que exista, é trivial escrever um atualizador automático para o seu programa se você distribuir a fonte: a fonte geralmente é muito menor que um binário que inclui todos os deps e outras insanidades. Usando esse método, não tive muitos problemas para implantar de forma confiável no Unices (e às vezes no Windows, mas isso é um pouco mais trabalhoso).

Chega de brincadeira, arme-se!

Quando você está falando sério, como o srsly srs, sobre como se encaixa perfeitamente no mundo Linux, distribui fontes C ou passa a um ambiente totalmente gerenciado para uma linguagem hackishly deliciosa que já foi pré-criada. Se você está escrevendo código Python, por exemplo, pode verificar as versões e saber com qual versão do CPython trabalha e geralmente espera que exista uma versão compatível em um determinado Linux (e isso é muito mais fácil de verificar do que uma ampla variedade de bibliotecas C / versões que você pode estar usando). Erlang, Guile, Python, Perl, CL, etc. são todos muito alvos fáceis para esse tipo de implantação, e muitos deles têm um repositório central, como CPAN ou pip (ou qualquer outro), onde os usuários podem executar um comando para puxar eles mesmos a fonte assinada quando quiserem, e sabem que as coisas geralmente funcionam como você pretendia. .

[Adendo: 1. Até Haskell geralmente consegue isso via Cabal - embora eu seja cauteloso ao fazer isso em um ambiente de produção. 2. Existem estratégias de implantação de "release" totalmente diferentes com o Erlang que garantem que seu código carrega um ambiente completo. 3. Python vai um passo além nos ambientes virtuais; nem todos os tempos de execução o ajudam tanto.]

Este último trecho sobre ambientes gerenciados no Linux é assustador . E, como bônus, permite definir dependências muito mais gerais, resolvê-las automaticamente sem nenhum esforço extra de sua parte, não requer a criação de um pacote por distribuição e você pode parar de se importar se um sistema é 32 ou 64 bit (geralmente, de qualquer maneira).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.