¿Es un ejecutable de Linux “compatible” con OS X?

Si comstack un progtwig en, por ejemplo, C, en una plataforma basada en Linux, luego lo porte para usar las bibliotecas de MacOS, ¿funcionará?

¿El código máquina central que proviene de un comstackdor es compatible tanto en Mac como en Linux?

La razón por la que pregunto esto es porque ambos están “basados ​​en UNIX”, así que creo que esto es cierto, pero no estoy muy seguro.

No, los binarios de Linux y Mac OS X no son compatibles.

Por un lado, los ejecutables de Linux usan un formato llamado ELF .

Los ejecutables de Mac OS X usan el formato Mach-O .

Por lo tanto, incluso si muchas de las bibliotecas ordinariamente se comstackn por separado en cada sistema, no serían portátiles en formato binario.

Además, Linux no está realmente basado en UNIX. Comparte varias funciones y herramientas comunes con UNIX, pero mucho de eso tiene que ver con estándares informáticos como POSIX.

EDITAR:

Finalmente, para abordar su punto en byte-code: al hacer un binario, los comstackdores generalmente generan código de máquina que es específico para la plataforma en la que está desarrollando. (Este no es siempre el caso, pero generalmente lo es).

En general, puede transferir fácilmente un progtwig a varias marcas de Unix. Sin embargo, necesita (al menos) recomstackrlo en cada plataforma.

Los ejecutables (binarios) no son utilizables en varias plataformas, porque un ejecutable está estrechamente vinculado con el ABI ( Application Binary Interface ) del sistema operativo, es decir, las convenciones de cómo una aplicación se comunica con el sistema operativo.

Por ejemplo, si su progtwig imprime una cadena en la consola utilizando la llamada de write POSIX, el ABI especifica:

  • Cómo se realiza una llamada al sistema (Linux solía llamar a la interrupción del software 0x80 en x86, ahora usa la instrucción sysenter específica)
  • El número de llamada del sistema
  • Cómo se transmiten los argumentos de la función al sistema
  • Cualquier tipo de alineación

Y esto varía mucho en los sistemas operativos.

Sin embargo, tenga en cuenta que en algunos casos puede haber “adaptadores ABI” que permitan ejecutar binarios de un sistema operativo en otro sistema operativo. Por ejemplo, Wine le permite ejecutar ejecutables de Windows en varios sabores de Unix, NDISwrapper le permite usar controladores de red de Windows en Linux.

“bytecode” por lo general se refiere al código ejecutado por una máquina virtual (por ejemplo, para Java o Python). C se comstack con el código de máquina, que la CPU puede ejecutar directamente. El lenguaje de máquina es específico del hardware, por lo que sería el mismo en cualquier sistema operativo que se ejecute en un chip de Intel (incluso en Windows), pero los detalles de cómo el código de máquina se integra en un archivo ejecutable y cómo se integra con las llamadas al sistema y las bibliotecas vinculadas dinámicamente son diferentes de un sistema a otro.

Entonces no, no puede tomar código comstackdo y usarlo en un sistema operativo diferente. (Sin embargo, existen “comstackdores cruzados” que se ejecutan en un sistema operativo pero generan código que se ejecutará en otro sistema operativo).

No existe un “código de bytes básico que proviene de un comstackdor”. Solo hay código de máquina .

Si bien las mismas instrucciones de máquina pueden ser aplicables en varios sistemas operativos (siempre y cuando se ejecuten en el mismo hardware), hay mucho más para un ejecutable alojado que eso, y dado que un ejecutable nativo comstackdo y vinculado para Linux tiene muy diferentes los requisitos de tiempo de ejecución y biblioteca de uno en BSD o Darwin, no podrá ejecutar un binario en el otro sistema.

Por el contrario, los binarios de Windows a veces se pueden ejecutar bajo Linux, ya que Linux proporciona tanto un cargador de formato binario para el formato PE de Windows como una extensa implementación de API (Wine). En principio, esta idea también se puede usar en otras plataformas, pero no conozco a nadie que haya escrito esto para Linux <-> Darwin. Si ya tiene el código fuente y comstack en Linux, entonces tiene buenas posibilidades de que también se compile bajo MacOS (componentes de interfaz de usuario de módulo, por supuesto).

Bueno, tal vez … pero probablemente no.

Pero si lo hace, no es “porque ambos son UNIX” es porque:

  • Las computadoras Mac usan el mismo procesador hoy en día (esto era muy diferente en el pasado)
  • Utiliza un progtwig que no tiene ninguna dependencia en ninguna biblioteca (muy poco probable)
  • Utiliza las mismas bibliotecas de tiempo de ejecución
  • Utiliza un formato cargador / binario que es compatible con ambos.