Pourquoi Windows ne fonctionne-t-il pas sous Linux?

29

Je ne demande pas comment faire fonctionner un exe Windows sous Linux.

Je demande POURQUOI cela ne fonctionne pas.

Qu'est-ce qui diffère dans la façon dont Windows exécute un exécutable et Linux exécute un exécutable? Pourquoi devaient-ils être différents? De plus, pourquoi les exécutables Linux n'ont-ils pas d'extension de fichier?

Nav
la source
1
Question similaire sur l' informatique : pourquoi ne puis-je pas exécuter un programme mac en natif sur Windows?
Gilles 'SO- arrête d'être méchant'

Réponses:

45

Les exécutables Linux et Windows utilisent différents formats. Linux utilise le format ELF sur la plupart des architectures, tandis que Windows utilise le format PE . ELF est mieux adapté à la façon dont Linux gère les bibliothèques partagées, et PE est mieux adapté à la façon dont Windows gère les bibliothèques partagées, mais il n'y a aucune raison fondamentale pour laquelle Linux ne pourrait pas exécuter les exécutables PE ou les exécutables Windows ELF. En fait, Linux peut exécuter des exécutables PE, via Wine .

La difficulté est que Windows et Linux ont des API complètement différentes : elles ont des interfaces de noyau et des ensembles de bibliothèques différents. Donc, pour exécuter réellement une application Windows, Linux devrait émuler tous les appels d'API que l'application effectue. Ça fait beaucoup de travail. Wine le fait dans une certaine mesure, mais c'est très difficile, d'autant plus que le fabricant de Windows ne coopère pas. Vous pouvez le comparer avec, disons, l'apprentissage de l'anglais lorsque votre langue maternelle est le chinois: le format exécutable est l'alphabet (pas si difficile à maîtriser), l'API est le vocabulaire (il faut des années pour arriver à un niveau où vous pouvez commencer à lire la littérature ).

Gilles 'SO- arrête d'être méchant'
la source
9
"Vocabulaire" est une excellente analogie.
pause jusqu'à nouvel ordre.
Je pense que vous vouliez dire complètement différent .
Mircea Chirea
Android prend également en charge les binaires Linux (pas les packages) s'ils sont compilés pour ARM car il est basé sur Linux
Suici Doga
@SuiciDoga En quelque sorte, mais c'est plus compliqué que ça. Le noyau Android peut exécuter des binaires Linux (s'ils sont compilés pour le bon noyau ABI, par exemple à l'aide de registres NEON), mais si vous souhaitez exécuter des programmes liés dynamiquement, vous devez également installer toutes les bibliothèques. (Et si vous faites cela, vous pouvez également installer un gestionnaire de paquets, donc "les binaires mais pas les paquets" n'est pas vraiment vrai.)
Gilles 'SO- arrête d'être mauvais'
Oui, je sais que vous devez changer le chemin de la bibliothèque, etc.
Suici Doga
14

Les binaires Windows ont un ABI différent et utilisent une API différente de celle des binaires Linux.

Les binaires Linux n'ont pas besoin d'une extension car * nix utilise des bits d'autorisation pour identifier un exécutable au lieu de l'extension.

Ignacio Vazquez-Abrams
la source
1
D'accord avec la réponse ... des données supplémentaires qui peuvent être pertinentes: ELF ( en.wikipedia.org/wiki/Executable_and_Linkable_Format ) vs PE ( en.wikipedia.org/wiki/PE_executable )
RobotHumans
Ah oui, il a également besoin d'un chargeur différent. en.wikipedia.org/wiki/Loader_%28computing%29
Ignacio Vazquez-Abrams
J'aime particulièrement la deuxième information manquante dans la réponse de @Gilles.
Timothy Gu
@ IgnacioVazquez-Abrams C'est très intéressant. Que faire si je vous dis que je viens de lancer nativement un jeu Windows PlantsVsZombies.exe sur Ubuntu 16.04 Linux? Je l'ai juste fait par ennui en sachant qu'il ne se lancerait pas, mais il l'a fait et je pouvais parfaitement le jouer. C'est comme impossible, car ce jeu a besoin de l'API Steam pour fonctionner en premier et ce n'est clairement pas le cas. Comment a-t-il été lancé ??? Dois-je poser une nouvelle question à ce sujet?
Nikos
@ RestlessC0bra: Wine et Mono sont des choses.
Ignacio Vazquez-Abrams le
0

C'est ainsi que j'ai entendu le côté Windows expliqué en termes simples par les programmeurs.

Dans Windows, il existe des hooks dans les programmes et le système d'exploitation auquel Exe fait des appels ne sera pas là sous Linux. En raison des différences dans les deux environnements. Initialement, Linux recherche des autorisations, Windows recherche d'abord un format pouvant être lié en examinant l'extension, en regardant les propriétés puis en regardant à l'intérieur du fichier Exe, etc.

Il y a des applications comme Netbackup qui ont commencé sous Linux et ont été modifiées pour fonctionner dans un environnement Windows sans utiliser Wine IMHO, souvent celles-ci sont parmi les meilleures applications Windows les plus stables.

Lorsque Windows Apps. devenir indiscipliné généralement parce que certains de ces crochets détenus par l'application n'ont pas été complètement libérés et Windows pense qu'ils l'étaient (Memory Leaks). Lorsque Windows remet cet espace mémoire non libéré à une autre application Plantage et gravure.

Facture
la source
2
D'une certaine manière, j'aimerais croire que Bill Gates a répondu à ma question ;-)
Nav