Qu'est-ce qui rend les programmes OSX non exécutables sous Linux?

40

Je sais qu'il existe de nombreuses différences entre OSX et Linux, mais qu'est-ce qui les rend si totalement différentes, ce qui les rend fondamentalement incompatibles?

Falmarri
la source
5
Pourquoi vous attendez-vous à ce que les programmes OSX soient exécutables sous Linux? Qu'en est-il de ces deux systèmes d'exploitation spécifiques, vous les mentionnez dans la question, mais pas d'autres systèmes d'exploitation qui ne peuvent pas non plus exécuter de programmes OSX?
wrosecrans
6
C'est fondamentalement ma question. OSX fonctionne sur un noyau unix. Je me demandais ce qui le rend si spécial par rapport aux autres Unix /
Linux
6
Il y a des petites pommes secrètes dans les fichiers binaires que seules les machines Mac peuvent voir 
bobobobo
En général, différents systèmes d'exploitation ne peuvent pas exécuter les fichiers binaires les uns des autres; C'est pourquoi la pratique de la distribution de logiciels en tant que fichiers source s'est développée autour d'Unix. Ni MacOS ni Linux ne sont spéciaux à cet égard: ce serait quelque chose de spécial si l'un ou l'autre pouvait exécuter les fichiers binaires de l'autre. Le commentaire plus voté répondant au commentaire de wrosecrans en manque totalement le sens. : /
Peter Cordes

Réponses:

56

L'ensemble du ABI est différent, pas seulement le format binaire (Mach-O versus ELF) comme mentionné par sepp2k.

Par exemple, alors que Linux et Darwin / XNU (le noyau d’OS X) utilisent sctous les deux l’entrée syscall sur PowerPC et int 0x80/ sysenter/ syscallsur 86, il n’ya pas grand-chose de commun à partir de là.

Darwin dirige les numéros d’appel système négatifs vers le micro-noyau de Mach et les numéros d’appel système positifs vers le noyau monolithique BSD - voir xnu / osfmk / mach / syscall_sw.h et xnu / bsd / kern / syscalls.master . Les numéros d'appels système de Linux varient selon l'architecture - voir linux / arch / powerpc / include / asm / unistd.h , linux / arch / x86 / include / asm / unistd_32.h et linux / arch / x86 / include / asm / unistd_64.h - mais sont tous non négatifs. Alors , évidemment , le nombre syscall, arguments syscall, et même qui syscalls existent sont différents.

Les bibliothèques d'exécution C standard sont également différentes; Darwin hérite principalement de la libc de FreeBSD, tandis que Linux utilise généralement glibc (mais il existe des alternatives, comme eglibc et dietlibc et uclibc et Bionic).

Sans oublier que toute la pile graphique est différente; En ignorant l'ensemble des bibliothèques Cocoa Objective-C, les programmes d'interface graphique sous OS X communiquent avec WindowServer via des ports Mach, tandis que sous Linux, les programmes d'interface graphique communiquent généralement avec le serveur X via des sockets de domaine UNIX utilisant le protocole X11. Bien sûr, il y a des exceptions. vous pouvez exécuter X sur Darwin et contourner X sous Linux, mais les applications OS X ne parlent certainement pas X.

Comme le vin, si quelqu'un met le travail dans

  • implémentation d'un chargeur binaire pour Mach-O
  • intercepter chaque appel système XNU et le convertir en appels système Linux appropriés
  • écrire des remplacements pour les bibliothèques OS X telles que CoreFoundation selon les besoins
  • écrire des remplacements pour des services OS X comme WindowServer selon les besoins

puis exécuter un programme OS X "nativement" sur Linux pourrait être possible. Il y a des années, Kyle Moffet avait travaillé sur le premier élément, en créant un prototype binfmt_mach-o pour Linux, mais celui-ci n'a jamais été achevé et je ne connais aucun autre projet similaire.

(En théorie, c’est tout à fait possible et des efforts similaires ont été faits à maintes reprises; outre Wine, Linux prend en charge l’exécution de binaires à partir d’UNIX tels que HP-UX et Tru64, et le projet Glendix vise à apporter la compatibilité de Plan 9 à Linux.)


Quelqu'un a déployé des efforts pour implémenter un chargeur binaire Mach-O et un traducteur d'API pour Linux!

shinh / maloader - GitHub adopte l’approche de type Wine pour charger le binaire et intercepter / traduire tous les appels de bibliothèque dans l’espace utilisateur. Il ignore complètement les appels système et toutes les bibliothèques graphiques, mais est suffisant pour faire fonctionner de nombreux programmes de console.

Darling s'appuie sur maloader, ajoute des bibliothèques et d'autres bits d'exécution compatibles.

éphémère
la source
Les nouveaux efforts seraient beaucoup plus susceptibles d'utiliser binfmt_misc que d'avoir leur propre code noyau, n'est-ce pas?
SamB
@SamB: Avez-vous déjà essayé de configurer un gestionnaire binfmt_misc dans un chroot? Je pense qu'il est plutôt raisonnable de gérer les formats binaires pour d'autres systèmes du noyau similaires à UNIX.
Ephemient
1
Ma question est; Si vous avez des fichiers binaires OS X sous Linux, pourquoi devriez-vous réécrire les bibliothèques et les services OS X? Ne fonctionneraient-ils pas sous Linux à ce stade? S'agit-il uniquement de questions juridiques?
Hubro
20

Pourquoi les applications OSX ne s'exécutent pas nativement sur linux:

Tout d'abord, OSX utilise un format binaire différent de celui de Linux, de sorte que Linux ne peut pas exécuter les fichiers binaires compilés pour OSX (de la même manière qu'il ne peut pas exécuter les fichiers binaires compilés pour Windows ou BSD).

Deuxièmement, si vous parlez d’applications graphiques, le toolkit d’interface graphique d’Apple Cocoa a) est uniquement disponible pour OSX et b) ne s’exécute pas au-dessus de X11.

Pourquoi il n'y a pas d'équivalent vin pour les applications OSX:

Beaucoup de travail devait être fait avant que le vin soit même à moitié utilisable. Comme il n’existe pas autant de demande d’un équivalent OSX, personne n’a encore investi le même effort dans un tel projet.

sepp2k
la source
Vous savez, je n'avais même pas réalisé que OSX / Unix n'utilisait pas le même format binaire. Avez-vous un lien vers plus d'informations à ce sujet?
Falmarri
Falmarri: OSX utilise le format Mach-O , Linux utilise ELF .
sepp2k
1
@ Falmarri Tous les UNIX n'utilisent pas le même format binaire, et même si presque tous les modernes utilisent ELF, vous ne pouvez toujours pas exécuter un fichier binaire d'un UNIX sur un autre. Heck, je ne pense pas que FreeBSD garantisse même que vous pouvez exécuter un programme pour 7.x sur 8.x ou inversement, alors qu'un programme Linux pour 1.0 devrait toujours fonctionner sur 2.6.x.
éphémère
5

La principale raison pour laquelle les applications OS X ne s'exécutent pas sous Linux est que ces systèmes d'exploitation utilisaient des appels système différents.

Certaines réponses précédentes mentionnaient des bibliothèques mais ce n’est généralement pas le cas - Core Foundation est en grande partie une source ouverte fournie par Apple sous le nom CFLite et peut facilement être transporté sur n’importe quelle plate-forme (la version Windows d’iTunes se trouve en réalité au sommet d’un port Windows de Core Foundation et compilations, vous pouvez directement créer CFLite en utilisant clang sur une distribution Linux) et il existe également des efforts en open source pour porter l’environnement Objective-C, principalement Foundation et AppKit sur Linux, notamment GNUstep, une implémentation GNU d’OpenStep, datée du plus tôt que Apple's Cocoa (a commencé lorsqu'il y avait encore la société NeXT Computer.)

Si quelqu'un est déterminé, il peut concevoir un chargeur qui capturera chaque appel système Mach-O et le traduira en appel système Linux correspondant, ainsi que lier dynamiquement ces "contreparties" de bibliothèque open source au binaire avec la traduction ABI appropriée.

Et juste pour votre information, si vous pouvez obtenir le code source de l'application Mach-O, vous pouvez envisager de le transférer et cela peut s'avérer très simple. Par exemple, l’application TextEdit fournie avec OS X 10.6 peut être directement recompilée en reliant GNUstep après avoir supprimé quelques lignes de code CF (non critique) et donc immédiatement disponible sous Linux (sans parler de TextEdit fourni avec GNUstep). recompilation directe de l'application TextEdit de NeXTSTEP, précurseur d'OS X également, en conservant même son étiquette "© 1995 NeXT"). TextEdit est sous licence BSD.

Maxthon Chan
la source