Prepárense, esta pregunta probablemente parecerá ingenua y / o tonta, ya que soy relativamente nuevo en el funcionamiento interno de los sistemas tipo UNIX y en la programación en general.
Listo? ¡Okay! Voy a pasar por unos 3 niveles de ludicrosidad, aumentando a medida que avance.
Tenemos dos sistemas con hardware similar (el punto principal es el procesador, digamos un Intel Core 2 Duo estándar).
Uno se está ejecutando (inserte su distribución de Linux aquí: Ubuntu se usará en adelante), y el otro se está ejecutando, digamos Mac OS X.
Uno compila un programa equivalente. Digamos algo como:
int main()
{
int cat = 33;
int dog = 5*cat;
return dog;
}
El código es extremadamente simple, porque todavía no quiero considerar las implicaciones de las bibliotecas compartidas.
Cuando se compila en los sistemas respectivos. ¿No es la principal diferencia entre la salida una cuestión de ELF vs Mach-O? Si uno despojara cada binario del formato, dejando un binario plano, ¿no serían las mismas instrucciones desmontadas de la máquina? (con quizás algunas diferencias dependiendo de los hábitos / tendencias del compilador).
1.) Si uno desarrollara un programa para reempaquetar el binario plano producido desde nuestro sistema Ubuntu, en el formato Mach-O, ¿se ejecutaría en el sistema Mac OS X? Entonces, si uno solo tuviera el binario compilado del supuesto programa anterior, y uno tuviera esta herramienta mística para reempaquetar binarios planos, ¿los programas simples podrían ejecutarse en el sistema Mac OS X?
Ahora vamos a llevarlo un poco más lejos.
Ahora tenemos un programa con fuente como:
#include <stdio.h>
int main()
{
printf("I like tortoises, but not porpoises");
return 0;
}
2.) Suponiendo que este programa se compila y está vinculado estáticamente, ¿podría nuestro programa mágico volver a empaquetar el binario sin formato en el formato Mach-O y hacerlo funcionar en Mac OS X? Como no necesitaría depender de ningún otro binario (para lo cual el sistema Mac no tendría en este caso)
Y ahora para el nivel final;
3.) ¿Qué pasa si usamos este supuesto programa para convertir todas las bibliotecas compartidas necesarias al formato Mach-O, y luego compilamos el programa anterior con enlaces dinámicos? ¿El programa todavía podría ejecutarse?
Eso debería ser todo por ahora, obviamente cada paso de lo absurdo se basa en la base anterior, incluso para tener sentido. así que si el primer pilar se destruye, dudo que haya mucho mérito para los niveles restantes.
Definitivamente, ni siquiera iría tan lejos como para pensar en esto con programas con GUI en mente. Los sistemas de ventanas probablemente serían otro dolor de cabeza. Solo estoy considerando programas de línea de comandos en esta etapa.
Ahora, invito al mundo a que me corrija y me diga todo lo que está mal en mi absurda línea de pensamiento.