GNU/Linux >> Tutoriales Linux >  >> Linux

Linux:¿Qué hace que los programas Osx no se puedan ejecutar en Linux?

Sé que hay muchas diferencias entre OSX y Linux, pero ¿qué los hace tan diferentes, que los hace fundamentalmente incompatibles?

Respuesta aceptada:

Todo el ABI es diferente, no solo el formato binario (Mach-O versus ELF) como se menciona en sepp2k.

Por ejemplo, tanto Linux como Darwin/XNU (el kernel de OS X) usan sc en PowerPC y int 0x80 /sysenter /syscall en x86 para la entrada de llamada del sistema, no hay mucho más en común a partir de ahí.

Darwin dirige números de llamada al sistema negativos al microkernel de Mach y números de llamada al sistema positivos al kernel monolítico BSD; consulte xnu/osfmk/mach/syscall_sw.h y xnu/bsd/kern/syscalls.master. Los números de llamada al sistema de Linux varían según la arquitectura:consulte linux/arch/powerpc/include/asm/unistd.h, linux/arch/x86/include/asm/unistd_32.h y linux/arch/x86/include/asm/unistd_64.h - pero todos son no negativos. Entonces, obviamente, los números de llamada al sistema, los argumentos de llamada al sistema e incluso cuál las llamadas al sistema que existen son diferentes.

Las bibliotecas de tiempo de ejecución estándar de C también son diferentes; Darwin hereda principalmente libc de FreeBSD, mientras que Linux normalmente usa glibc (pero hay alternativas, como eglibc, dietlibc, uclibc y Bionic).

Sin mencionar que toda la pila de gráficos es diferente; ignorando todas las bibliotecas de Cocoa Objective-C, los programas GUI en OS X se comunican con WindowServer a través de puertos Mach, mientras que en Linux, los programas GUI generalmente se comunican con el servidor X a través de sockets de dominio UNIX utilizando el protocolo X11. Por supuesto que hay excepciones; puede ejecutar X en Darwin y puede omitir X en Linux, pero las aplicaciones OS X definitivamente no hablan X.

Como Wine, si alguien puso el trabajo en

  • implementación de un cargador binario para Mach-O
  • atrapar cada llamada del sistema XNU y convertirla en llamadas del sistema Linux apropiadas
  • escribir reemplazos para bibliotecas OS X como CoreFoundation según sea necesario
  • escribir reemplazos para servicios OS X como WindowServer según sea necesario

entonces podría ser posible ejecutar un programa OS X "de forma nativa" en Linux. Hace años, Kyle Moffet trabajó un poco en el primer elemento, creando un prototipo binfmt_mach-o para Linux, pero nunca se completó y no conozco otros proyectos similares.

(En teoría, esto es bastante posible, y se han realizado esfuerzos similares muchas veces; además de Wine, el propio Linux tiene soporte para ejecutar binarios de otros UNIX como HP-UX y Tru64, y el proyecto Glendix tiene como objetivo llevar la compatibilidad con Plan 9 a Linux.)

Alguien tiene ¡haga el esfuerzo de implementar un cargador binario Mach-O y un traductor de API para Linux!

shinh/maloader:GitHub adopta el enfoque similar a Wine de cargar el binario y capturar/traducir todas las llamadas de la biblioteca en el espacio de usuario. Ignora por completo las llamadas al sistema y todas las bibliotecas relacionadas con gráficos, pero es suficiente para que muchos programas de consola funcionen.

Relacionado:Linux:¿cómo mostrar el mensaje de bienvenida en Unix?

Darling se basa en maloader, añadiendo bibliotecas y otros bits de tiempo de ejecución de apoyo.


Linux
  1. ¿Qué hace que un servidor Kernel Linux sea fundamental?

  2. ¿Qué es Red Hat Linux?

  3. ¿Qué es JingOS Linux?

  4. El comando de Linux 'll' no funciona

  5. En qué casos CLOCK_MONOTONIC podría no estar disponible

¿Qué es umask en Linux?

¿Qué es el Shell en Linux?

¿Qué es Login Shell en Linux?

¿Qué es el promedio de carga en Linux?

¿Qué es el archivo .bashrc en Linux?

¿Por qué Wine puede ejecutar programas de 64 bits en Linux pero no en Mac?