Preparem-se, essa pergunta provavelmente parecerá ingênua e / ou tola, visto que eu sou relativamente novo no funcionamento interno de sistemas como o Unix e na programação em geral.
Pronto? Está bem! Vou passar por cerca de três níveis de ludicrosidade, aumentando à medida que avanças.
Temos dois sistemas com hardware semelhante (o ponto principal é o processador, digamos um intel core 2 duo padrão).
Um está em execução (insira sua distribuição Linux aqui: o Ubuntu será usado a partir de agora), e o outro está em execução, digamos, 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 ainda não quero considerar as implicações das bibliotecas compartilhadas.
Quando compilado nos respectivos sistemas. Não é a principal diferença entre a saída 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 desmontada não seriam as mesmas? (talvez com algumas diferenças, dependendo dos hábitos / tendências dos compiladores).
1.) Se alguém desenvolvesse um programa para reembalar 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 o binário compilado do suposto programa acima e se tivesse essa ferramenta mística para reembalar binários simples, programas simples seriam capazes de executar no sistema Mac OS X?
Agora vamos um pouco mais longe.
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 vinculado estaticamente, nosso programa mágico ainda seria capaz de reembalar o binário bruto no formato Mach-O e fazê-lo funcionar no mac os X? Visto que não precisaria confiar em outros binários (para os quais o sistema mac não teria neste caso)
E agora para o nível final;
3.) E se usássemos esse suposto programa para converter todas as bibliotecas compartilhadas necessárias para o formato Mach-O e, em vez disso, compilássemos o programa acima com vínculo dinâmico. O programa ainda conseguiria executar?
Por enquanto, obviamente, cada passo do absurdo se apóia na base anterior, até para fazer sentido. portanto, se o primeiro pilar for destruído, duvido que haja muito mérito nos demais níveis.
Definitivamente, eu nem chegaria a pensar nisso com programas com GUI em mente. Os sistemas de janelas provavelmente seriam uma dor de cabeça totalmente diferente. Estou apenas considerando programas de linha de comando nesta fase.
Agora, convido o mundo a me corrigir e a contar tudo o que há de errado com minha linha de pensamento absurda.