Siempre me pregunté cómo funcionan realmente los archivos binarios ejecutables. La compilación siempre se indica como
Tomar el código fuente y traducirlo al lenguaje de máquina.
Pero, ¿qué significa esto realmente? A saber:
- ¿Puedo mover un archivo binario de la computadora A a la computadora B y esperar que funcione? (suponiendo que también muevo las bibliotecas apropiadas)
- ¿Cada archivo binario ejecutable está diseñado para funcionar con un procesador específico?
- ¿Qué tipo de información hay dentro de un archivo binario ejecutable?
- ¿Cómo es que los archivos ejecutables en Windows se pueden ejecutar en cualquier versión de Windows? (Es otra historia si funcionan)
- ¿Por qué no puedo ejecutar un ejecutable de Linux en Windows? ¿Tiene que ver con el kernel (por lo tanto, no con el procesador)?
Tenga en cuenta que tengo conocimientos limitados sobre procesadores y compiladores y ninguno sobre ensamblaje.
Respuesta1
- No necesariamente. Si está diseñado para la portabilidad y las plataformas son compatibles, entonces sí (por ejemplo, las ediciones de 64 bits de Windows pueden ejecutar ejecutables de Windows de 32 y 64 bits, pero ya no los de 16 bits).
- No necesariamente. Están hechos para un conjunto de instrucciones específico. Dado que normalmente son extensiones y hay compatibilidad con versiones anteriores, es posible ejecutar archivos más antiguos en procesadores más nuevos, pero no necesariamente al revés. Por ejemplo, un programa compilado para Windows 95 probablemente aún se ejecutará en el hardware actual, pero no se puede ejecutar un programa compilado para el hardware actual en una máquina antigua con Windows 95. Sin embargo, si dos máquinas ejecutan instrucciones completamente diferentes, los ejecutables no serán compatibles (por ejemplo, Intel frente a ARM).
- Esto depende de la plataforma, hay múltiples formatos con diferentes encabezados y demás, pero básicamente siempre hay algún tipo de encabezado que funciona como índice y le indica al sistema operativo dónde encontrar cosas específicas (como el punto de entrada principal).
- En realidad no pueden (ver n.° 2 arriba).
- En primer lugar, Windows y Linux utilizan formatos diferentes para sus archivos ejecutables. Pero incluso entonces existen diferencias, por ejemplo, todo el entorno y las API/bibliotecas de la plataforma proporcionadas. Por ejemplo, un ejecutable de Linux normalmente intentaría comunicarse con un administrador de ventanas como X11, mientras que un programa de Windows intentaría llamar a la API de Windows. Sin embargo, hay formas de hacer que estas cosas funcionen. Las versiones anteriores de Windows (¿NT?) en realidad tenían extensiones POSIX para que pudieras ejecutar un conjunto limitado de programas de Linux, hasta donde yo sé, aunque nunca lo probé ni lo miré más de cerca. Por otro lado, para Linux existen herramientas como Wine, que intentarán emular el entorno de Windows, proporcionando archivos API, conversiones de rutas, etc. No es una emulación completa (como cuando se usa una máquina virtual).
Respuesta2
Sólo en circunstancias muy controladas: Ambos ordenadores deben tener un procesador y un sistema operativo compatibles.
No un procesador específico, sino un conjunto de procesadores compatibles. Por ejemplo, un archivo compilado para compatibilidad con x86 y sin extensiones funcionará en todos los procesadores Intel o AMD x86 o x64, suponiendo que el sistema operativo sea compatible.
En primer lugar, el código de máquina del paso de compilación. Además de eso, algunas otras llamadas "secciones" tendrán, por ejemplo, recursos (alguna vez se preguntó por qué un ejecutable tiene un icono dedicado en Windows, incluso si no se está ejecutando, sino que simplemente se muestra en el explorador), la descripción de la compatibilidad binaria y más.
Este es un efecto secundario de 1.: Siempre que el sistema operativo proporcione compatibilidad con el formato ejecutable, se puede iniciar. Las versiones modernas de Windows ofrecen una variedad de compatibilidad: DOS, Win16, Win32, Win64 y dotnet son las más importantes.
El sistema operativo proporciona al ejecutable un entorno que es indispensable para la ejecución. Esos entornos difieren enormemente entre Linux y Windows. Esto significa que no puedes ejecutar ejecutables directamente de uno a otro. Hay proyectos en marcha para cerrar esta brecha: el proyecto WINE tiene como objetivo permitir el lanzamiento de ejecutables de Windows en Linux (y otros sistemas operativos), mientras que el proyecto Cygwin tiene como objetivo hacer posible ejecutar software de Linux en Windows. Cygwin no apunta a la compatibilidad binaria, sino a permitir la recompilación de fuentes no modificadas.
Es importante comprender que el ejecutable (por ejemplo, el .exe) esnoel resultado del proceso de compilación - es el resultado de laenlaceproceso, que combina el resultado de la compilación con los otros ingredientes necesarios para crear lo que describí en 3.