* nix compatibilidade executável

1

Eu olhei para este esquema e agora eu quero saber, um executável pode ser executado em dois sistemas, que têm o mesmo ancestral? (e provavelmente o mesmo kernel?)

Por exemplo, de acordo com o esquema: Solaris < - System V R4 < - BSD 4.3 , o BSD * (OpenBSD, FreeBSD, NetBSD) e o Solaris podem funcionar da mesma forma? executável?

S. pode ser esta pergunta é óbvia e significante para você, mas eu sou completamente novo para o * nix, então para mim é importante.

    
por Amabo Carab 04.07.2016 / 14:06

2 respostas

5

Resposta curta: Não.

Resposta média: talvez, se o sistema operacional de destino oferecer suporte.

Resposta longa ...

A primeira coisa a ter em conta é que diferentes fornecedores podem usar chipsets diferentes. Portanto, um binário do Solaris pode ser compilado para um chip SPARC. Isso não será executado em uma máquina Intel / AMD. Da mesma forma, o AIX pode estar em um PowerPC. O HP-UX pode estar no PA-RISC. Vamos ignorar todos esses problemas e ficar no espaço "Intel / AMD".

O próximo problema é que sistemas operacionais diferentes podem expor diferentes chamadas de sistema do kernel . Isso significa que qualquer chamada que o aplicativo fizer no kernel não fará o que é esperado. Isto é obviamente um problema. No entanto, o kernel de destino pode ser capaz de fornecer uma "camada de compatibilidade ABI"; o kernel (digamos que um kernel do FreeBSD) pode detectar que você está tentando executar um binário do Linux e pode traduzir entre o ABI do kernel do Linux e o ABI do kernel nativo.

O problema next é uma das bibliotecas; um binário do Linux esperaria poder carregar o glibc de uma versão específica, que pode não estar presente no SO de hospedagem. Isso pode ser solucionável, copiando as bibliotecas necessárias. Novamente, um sistema operacional pode facilitar isso para você, por exemplo, por ter um pacote para essas bibliotecas para facilitar sua instalação.

Depois de tudo isso, seu binário pode executar: -)

Nos anos 90, o Linux tinha um módulo iBCS que permitia exatamente esse tipo de coisa. Isso tornou possível executar, por exemplo, programas SCO Unix no Linux. Eu tinha executado o SCO Unix Oracle na minha máquina como prova de conceito. Funcionou muito bem! Obviamente, não havia suporte a fornecedores, por isso não era adequado para produção: -)

Agora, o Linux tem uma grande presença nesse espaço, e outros sistemas operacionais tentam adicionar camadas de compatibilidade para permitir que os programas Linux sejam executados em seus sistemas operacionais.

Portanto, se o seu sistema operacional suportar e se você instalar e configurar corretamente, então poderá ser capaz de executar alguns programas de outro Unix.

    
por 04.07.2016 / 14:39
0

Não, e em muitos casos, um executável não pode sequer ser executado no mesmo sistema operacional de uma versão diferente devido a alterações no kernel.

Um exemplo simples que eu encontrei no outro dia: o comando dmesg no OpenBSD mostra o buffer de mensagens do sistema, que é onde todas as mensagens do kernel vão (informações de inicialização, etc.). Recentemente recompilei o kernel e, de repente, o dmesg voltaria dizendo

dmesg: sysctl: KERN_MSGBUF: Cannot allocate memory

Isto foi devido a não recompilar os utilitários de usuário, e dmesg , embora "trabalhando" no sentido de que o arquivo executável foi reconhecido como tal, não pôde executar sua tarefa (devido a alterações no código do kernel) .

Portanto, dmesg de uma versão anterior não "funcionaria" em uma versão posterior do sistema operacional.

EDITAR (de comentários, com acréscimos)

Pense nas chamadas do sistema do kernel como uma API. O que significaria para a API se não fosse possível alterá-la ou se fosse necessário manter a compatibilidade com versões anteriores o tempo todo? Não é uma falha de design, é como o software funciona em geral.

Você não pode esperar executar código compilado em uma versão da API para funcionar com qualquer outra versão dessa API. Como desenvolvedor de API / kernel, você ficaria mais preocupado em quebrar a compatibilidade com versões anteriores do que com a adição e melhoria do sistema operacional.

Felizmente, a maioria dos softwares em sistemas Unix são projetados de acordo com o padrão POSIX, o que significa que a fonte do executável é transferível entre tipos de sistema e será compilada e executada em praticamente qualquer lugar. A questão da compatibilidade binária entre plataformas Unix só se torna um problema quando

  • Extensões não POSIX são necessárias e
  • O código-fonte é de código fechado.
por 04.07.2016 / 14:46