Prepare-se, esta pergunta provavelmente parecerá ingênua e / ou tola, visto que eu sou relativamente novo no funcionamento interno de sistemas semelhantes a unix e programação em geral.
Pronto? Está bem! Eu vou passar por cerca de 3 níveis de ludicidade, aumentando à medida que vou adiante.
Nós temos dois sistemas com hardware similar (o ponto principal é o processador, digamos um intel core 2 duo padrão).
Um está rodando (insira sua distro linux aqui: o Ubuntu será usado daqui em diante), e o outro está rodando digamos o Mac OS X.
Um compila um programa equivalente, digamos algo como:
int main()
{
int cat = 33;
int dog = 5*cat;
return dog;
}
O código é extremamente simples, porque eu não quero considerar as implicações das bibliotecas compartilhadas ainda.
Quando compilado nos respectivos sistemas. Não é a principal diferença entre a saída de uma questão de ELF vs Mach-O? Se alguém tirasse cada binário da formatação, deixando um binário plano, as instruções da máquina desmontadas não seriam as mesmas? (com talvez algumas diferenças dependendo dos hábitos / tendências dos compiladores).
1.) Se alguém fosse desenvolver um programa para reempacotar o binário plano produzido em nosso sistema Ubuntu, na formatação Mach-O, ele seria executado no sistema Mac OS X? Então, se alguém tivesse apenas o binário compilado do programa acima, e alguém tivesse essa ferramenta mística para reempacotar binários planos, programas simples seriam capazes de rodar no sistema Mac OS X?
Agora vamos dar um passo adiante.
Agora temos um programa com fonte, como:
#include <stdio.h>
int main()
{
printf("I like tortoises, but not porpoises");
return 0;
}
2.) Supondo que este programa seja compilado e estaticamente ligado, nosso programa mágico ainda seria capaz de reempacotar o binário bruto no formato Mach-O e fazê-lo funcionar no Mac OS X? Visto que não precisaria depender de nenhum outro binário (para o qual o sistema mac não teria neste caso)
E agora para o nível final;
3.) E se usássemos este suposto programa para converter todas as bibliotecas compartilhadas necessárias para o formato Mach-O, e então compilássemos o programa acima com links dinâmicos. O programa ainda teria sucesso?
Deve ser por enquanto, obviamente, cada passo do absurdo depende da base anterior, até para fazer sentido. Então, se o primeiro pilar for destruído, duvido que haja muito mérito para os demais.
Eu definitivamente não iria tão longe a ponto de pensar nisso com programas com GUI em mente. Os sistemas de janelas provavelmente seriam uma outra dor de cabeça. Estou considerando apenas programas de linha de comando neste estágio.
Agora, eu convido o mundo para me corrigir, e me diga tudo que está errado com minha linha de pensamento absurda.