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.