En general, los programas no son compatibles debido a las diferencias en su interfaz binaria de aplicación (ABI) .
¿El programa no se ejecuta directamente en la CPU?
NO ! Ese es el trabajo del sistema operativo, evitar que las aplicaciones se ejecuten "directamente" en la CPU. Normalmente, en el nivel más bajo (es decir, en el que se basa la API del sistema operativo), una aplicación interactúa con el núcleo del sistema operativo .
¿Es porque el programa compilado en sí mismo necesita hacer referencia a bibliotecas específicas del sistema operativo?
Sí . Muchas bibliotecas del sistema operativo están escritas para facilitar la interfaz con el sistema operativo en sí, pero hay tantas que están escritas para ser multiplataforma. Estos ocultan la interfaz del sistema operativo de bajo nivel del desarrollador, y asume que la versión compilada para ese sistema operativo estará disponible en tiempo de ejecución (ver más abajo).
Aunque las bibliotecas se pueden escribir de manera multiplataforma, cuando se compilan no se pueden ejecutar multiplataforma. Todavía deben volver a compilarse para el sistema operativo de destino específico, nuevamente para utilizar los componentes subyacentes particulares del sistema operativo (kernel).
¿Cuál es la diferencia entre un programa compilado para un sistema operativo frente a otro?
Finalmente, los archivos ejecutables a menudo contienen encabezados de carga binarios muy específicos y demás (por ejemplo, el formato de archivo ejecutable PE [.exe, .dll, etc ...] para Windows o ELF para Linux [ninguno, .o, .so , etc ...]). Estos también pueden incluir código para cargar los binarios compilados específicos del sistema operativo para una biblioteca de software en particular.
Por último, desde la perspectiva de un programador: convocatoria de convenciones . El código compilado pasa variables a funciones de una manera dada (es decir, a través de registros o en la pila) en un orden muy particular. Incluso entonces, también debe acordarse quién es responsable de "limpiar" las llamadas de función (¿la persona que llama o la persona que llama?). Aunque hay varias convenciones de llamadas x86 estándar y ampliamente utilizadas , algunas pueden no ser compatibles con ciertos sistemas operativos (esto es parte de la ABI).