web-dev-qa-db-fra.com

Compatibilité binaire entre Mac OS X et Linux

Brace vous-même, cette question semblera probablement naïve et/ou idiote, voir comme je suis relativement nouveau dans le fonctionnement interne des systèmes Unix comme des systèmes et la programmation en général.

Prêt? D'accord! Je traverserai environ 3 niveaux de ludicrosion, augmentant au fur et à mesure que je vais.


On est en cours d'exécution (insérez votre distro Linux ici: Ubuntu sera utilisé désormais), et l'autre est en cours d'exécution, disons Mac OS X.

On compile un programme équivalent, disons quelque chose comme:

int main()
{
    int cat = 33;
    int dog = 5*cat;
    return dog;
}

Le code est extrêmement simple, car je ne veux pas encore examiner les implications des bibliothèques partagées.

Lorsqu'il est compilé sur les systèmes respectifs. La principale différence entre la sortie est-elle une question d'elf vs mach-o? Si on devait dépouiller chaque binaire du formatage, laissant un binaire plat, les instructions de la machine démontées ne seraient-elles pas les mêmes? (Avec peut-être quelques différences en fonction des habitudes/tendances des compilateurs).

1.) Si vous deviez développer un programme pour reconditionner le binaire plat produit à partir de notre système Ubuntu, dans la mise en forme de MACH-O, fonctionnerait-il dans le système Mac OS X? Ensuite, si l'on n'avait que le binaire compilé du programme supposé ci-dessus et que l'on avait cet outil mystique pour reconditionnez des fichiers binaires plats, les programmes simples pourraient-ils pouvoir exécuter sur le système Mac OS X?


Nous avons maintenant un programme avec une source telle que:

#include <stdio.h>
int main()
{
    printf("I like tortoises, but not porpoises");
    return 0;
}

2.)En supposant que ce programme soit compilé et lié statilement, notre programme magique pourra toujours rechater le binaire brut du format Mach-O et son fonctionnement sur Mac OS X? Voir car il ne serait pas nécessaire de fier à d'autres fichiers binaires (pour lesquels le système Mac n'aurait pas dans ce cas)


3.)Et si nous utilisions ce programme supposé pour convertir toutes les bibliothèques partagées nécessaires au format Mach-o, puis a compilé le programme ci-dessus avec une liaison dynamique. Le programme réussirait-il toujours à courir?

Cela devrait être pour le moment, évidemment, chaque étape d'absurdité s'appuie sur la base précédente, même de sens. Donc, si le tout premier pilier est détruit, je doute qu'il y aurait beaucoup de mérite aux niveaux restants.

Je ne voudrais même pas y aller aussi loin que de penser à cela avec des programmes avec interface graphique. Les systèmes de fenêtres seraient probablement un autre mal de tête. Je ne considère que des programmes de ligne de commande à ce stade.

Maintenant, j'invite le monde à me corriger et à me dire tout ce qui ne va pas avec ma ligne de pensée absurde.

28
zec

Vous oubliez une chose cruciale, à savoir que votre programme devra interagir avec le système d'exploitation pour faire quoi que ce soit intéressant.

Les conventions sont différentes entre Linux et OS X, de sorte que le même binaire ne peut pas fonctionner aussi, sans avoir essentiellement un bloc de code dépendant du système d'exploitation pour pouvoir interagir avec elle. Beaucoup de ces choses sont cachées dans les bibliothèques, que vous devez ensuite relier, et cela signifie que votre programme doit être lié et que la liaison est également différente entre les deux systèmes.

Et donc ça continue et encore. Quoi de la surface ressemble à faire la même chose est très différent dans les détails réels.

25

Ceci est faisable si quelqu'un veut passer suffisamment de temps pour y arriver. Le Darling Project tente ceci, bien que comme de cet écriture, c'est dans un état assez primitif.

Cela a été fait avec succès avant d'autres plates-formes:

  • Solaris et Unixware incluent un programme d'assistance appelé lxrun qui fonctionne quelque chose comme Sudo: vous transmettez votre nom et paramètres exécutables à l'aide de l'aide et fixes de manière dynamique afin que L'exécutable peut parler au système d'exploitation. Le Site officiel (Down, Link Archive ) dit que c'est bitté .

  • Le noyau de Linux avait une fois une fonctionnalité appelée IBCS qui a fait l'inverse, sauf que cela n'avait pas besoin d'un assistant, car le noyau a reconnu directement les fichiers binaires "étrangers". Il est tombé dans le discours lors de la série de développement du noyau 2. , probablement parce que la petite bataille de serveur UNIX était essentiellement une fois 2,4 est sortie.

  • Le noyau de FreeBSD peut être configuré pour reconnaître les binaires Linux et les exécuter comme si elles étaient indigènes. Cette fonctionnalité semble être en meilleure forme que les deux ci-dessus.

    OpenBSD et NetBSD ont des caractéristiques similaires.

OS X a beaucoup de freebsd dedans , alors portant son support Linux pourrait être simple.

18
Warren Young

Je suis tout à fait d'accord avec tout le monde, mais je tiens à ajouter cela, alors que cela prendrait une durée et efforts importants, ce ne serait pas presque autant que nécessaire pour développer le vin.

Une grande partie du développement du vin difficile est qu'ils portent un format binaire à partir d'un système d'exploitation à la source fermée et de nombreux appels système sont sans papiers. Ils devaient essentiellement inverser ingénieur le système d'exploitation.

Si quelqu'un devait faire cela à partir d'un système d'exploitation ouvert à un autre système d'exploitation ouvert, ils auraient probablement pu le faire en 1/10 de l'époque, car la couche de compatibilité pourrait être assez concevable/collé de l'autre système d'exploitation si un système de système natif équivalent n'existe pas. Bien sûr, dans la plupart des cas de l'ensemble du monde de Posix, un appel indigène sera disponible.

Un autre projet de note est réactif, où ils créent essentiellement une version complète compatible Binary de Windows ... pas besoin de vin.

3
joe

Il est techniquement faisable dans les macos mais pas sans effort significatif, même si certains des efforts sont déjà faits pour nous.

  • MacOS et une Enterprise Red Hat Enterprise Linux ont été certifiées UNIX 03. Cela signifie en principe POSIX Les appels devraient avoir la même API.
  • MacOS et Linux utilisent à la fois le système V ABI pour la plate-forme AMD64. Cela signifie que pour AMD64 MacOS et Linux devraient avoir compatible ABI et API.
  • macOS utilise Mach-o comme format exécutable natif pendant que Linux utilise ELF. Cela facilite les choses, car le format de fichier exécutable peut être utilisé pour distinguer si la couche de compatibilité doit être appelée. Cela nécessiterait quelque chose comme binfmt_misc bien que.
  • Il existe une extension de noyau de macos tiers qui fournit exactement cela. Nous avons maintenant un moyen de charger Convince MacOS pour charger Elf, nous avons besoin de notre spécial ld-linux.so qui lui-même est une exécutable Mach-o qui chargerait notre elfe et le gérerait.

Maintenant, ce dont nous avons besoin, c'est au moins un spécial ld-linux.so qui peut faire ce qui suit:

  • Être exécutable mach-o ou dyld lui-même,
  • Peut charger des fichiers Elf Linux en mémoire à l'adresse correcte,
  • Espérons que la possibilité de cartographier Linux Soname à MacOS (Exemple /lib/libc.so.6 à /lib/libSystem.B.dylib) et chargement correspondant à Mach-o lorsqu'un elfe correspondant n'est pas trouvé, nous pouvons donc réutiliser les bibliothèques de MacOS

Avec juste ce chargeur ELF ci-dessus qui ne fait pas syscalls directe a une bonne chance de travailler, mais ELF avec syscalls ne fonctionne pas. Un deuxième élément qui pourrait être utile serait une extension du noyau qui attire les syscalls Linux et les cartes à ceux de Mac OS. À propos des utilisations de bureau, la mise en œuvre de MESA spéciale est nécessaire pour cartographier les appels graphiques Linux à OpenGL.framework et Metal.framework.

1
Maxthon Chan

Il existe un certain nombre d'applications de Linux spécialisées pour lesquelles ce serait une bonne aide. Sur le côté FPGA, Quartus et Vivado sont de bons exemples de programmes qui fonctionnent sous Linux et il est peu probable que ce soit un code source disponible pour eux ou des programmes similaires qui ciblent les derniers FPGA.

Je pense que la réponse simple à votre question est la suivante: recompiler sur MacOS où vous avez la source et former un groupe pour fournir la capacité si vous avez le temps - et ce sera une tâche fastidieuse.

0
Daniel Wisehart