Puis-je exécuter un fichier Windows .exe sous Linux? [dupliquer]

12

Question connexe:
pourquoi Windows ne fonctionne-t-il pas sous Linux?

Un .exefichier Windows peut-il être exécuté sur Linux?

Si la même architecture est utilisée, sera-ce possible? Comme si les deux programmes s'exécutent sur une architecture X86, sera-t-il possible d'exécuter un Windows .exesous Linux?

Varun Janga
la source

Réponses:

13

Le fichier exe s'exécutera sous Linux ou Windows, mais pas les deux.

Exécute sous Windows

Si le fichier est un fichier Windows, il ne fonctionnera pas sous Linux seul. Donc, si c'est le cas, vous pouvez essayer de l'exécuter sous une couche de compatibilité Windows (Wine). S'il n'est pas compatible avec wine, vous ne pourrez pas l'exécuter sous Linux.

Avant de commencer, vous devez installer Wine. Les étapes à suivre pour installer Wine varient selon la plateforme Linux sur laquelle vous vous trouvez. Vous pouvez probablement Google "Ubuntu install wine", si par exemple, vous installez Ubuntu.

Une fois Wine installé, vous pourrez exécuter ces commandes.

wine xxx.exe

Exécuter sous Linux

Si vous savez que ce fichier s'exécute sous linux, alors vous voudrez exécuter ces commandes:

Vous souhaitez modifier les autorisations pour permettre à tous les utilisateurs de e x ecute ce fichier (a + x). vous pouvez également autoriser uniquement l'utilisateur à exécuter e x (u + x)

chmod a+x xxx.exe

Lancez le programme, le ./dit à la ligne de commande de chercher dans le chemin courant le fichier à exécuter (si le répertoire 'courant' n'est pas dans la variable d'environnement $ PATH.

./xxx.exe
Thariama
la source
11

Le système d'exploitation (Windows ou Linux) fournit des services aux applications. Par exemple, Windows et Linux auront des fonctions que l'application peut appeler pour accéder aux fichiers, accéder au réseau, afficher des choses à l'écran, etc.

Les différents systèmes d'exploitation offrent différentes façons de faire ces choses, donc une application qui le fait à la manière de Windows ne fonctionnera pas sur Linux, et vice versa, même si l'architecture du processeur est la même.

Angus
la source
2
Cette réponse est correcte. Ce n'est pas la seule raison (les différents chargeurs et formats exécutables sont également essentiels), mais c'est l'un d'eux.
Matthew Flaschen
2
C'est l'une des principales raisons pour lesquelles vous ne pouvez pas exécuter le même exécutable en mode natif sur différents systèmes d'exploitation.
1
@Let_Me_Be: En fait, votre commentaire n'est pas correct.
0xA3
1
@ 0xA3 Si vous accédez à une API spécifique à la plate-forme, alors oui. Mais pour la plupart, ce n'est en fait pas vrai. Réimplémenter la bibliothèque standard C ou C ++ est en fait très simple, il vous suffit de réimplémenter les bogues et de rediriger les appels. Ce qui demande beaucoup de travail, c'est un format de fichier différent (et des API spécifiques à la plate-forme car ils doivent être réimplémentés à partir de zéro).
Let_Me_Be
2
@Let, je n'ai jamais dit que tu devrais. Je faisais remarquer que vous avez dit "pour la plupart", les programmes n'utilisent pas d'API spécifiques à la plate-forme; en fait, la plupart le font . Même les programmes utilisant des bibliothèques multiplates-formes comme GTK utilisent encore indirectement des API spécifiques à la plate-forme.
Matthew Flaschen
8

Non, différents systèmes d'exploitation utilisent des formats différents (c.-à-d. Windows utilise PE tandis que linux utilise ELF). De plus, une fois compilé, votre programme appelle des méthodes natives du système d'exploitation. Comme mentionné, vous pouvez envisager d'utiliser WINE . Il fournit la plupart des fonctionnalités pour exécuter des binries Windows sous Linux.

Nico Huysamen
la source
5

Il existe trois raisons principales pour lesquelles les fichiers .exe ne s'exécutent pas directement sous Linux et pourquoi un exécutable Linux ne s'exécute pas directement sous Windows.

  1. Le premier est les appels système. Les appels système sont, presque par définition, spécifiques à la plate-forme. Cependant, tous les appels système ne sont pas identiques. Il existe des appels système portables (par exemple définis par la bibliothèque standard C / C ++) et des appels système non portables (par exemple définis par POSIX ou Microsoft). Les applications qui sont liées statiquement au moment de la compilation avec les bibliothèques système trouveraient que la partie du code qui est inclus statiquement n'aurait probablement aucune chance de s'exécuter correctement dans la plate-forme cible en raison de la conception très différente de la plate-forme. Les applications qui sont liées dynamiquement au moment de l'exécution ont une chance de fonctionner avec quelques conditions: s'il s'agit d'appels système portables, il existe une table de traduction entre les appels système des binaires d'origine aux appels système de la plate-forme cible; s'il s'agit d'un appel système non portable,1 , différentes plates-formes ont un ensemble de fonctionnalités différent, et certaines fonctionnalités n'ont pas de sens dans l'autre plate-forme 2 ).

    Solution: Pour exécuter le programme Windows sous Linux, Wine fournit une implémentation des appels système Windows et des bibliothèques système Windows, il reconnaît également le format PE; Wine peut exécuter le programme Windows sous Linux sans recompilation. Pour le programme Linux sous Windows, Cygwin fournit une implémentation des appels système POSIX sous Windows et permet au programme écrit pour Linux d'être recompilé à l'aide de Cygwin GCC de s'exécuter sur le système Windows sans modification du code source. En raison de la nature open source de la plupart des programmes Linux, il est plus facile de recompiler que d'aller dans le sens de Wine pour fournir une couche compatible binaire. Il n'est pas impossible de fournir une couche de compatibilité similaire à Wine, mais la méthode de Cygwin est plus robuste et il n'y a tout simplement pas beaucoup de lecteur pour permettre au programme Linux non open source d'être facilement porté sur Windows.

  2. L'autre est le format exécutable. Windows utilise le format PE (Portable Executable) et Linux utilise ELF (Executable and Linkable Format). Le format exécutable contient des métadonnées et définit la manière dont l'exécutable doit être chargé et exécuté par la plateforme.

    Solution: Il est tout à fait possible d'écrire un convertisseur PE -> ELF ou ELF -> PE; et cela ne devrait probablement pas être trop difficile à faire (avertissement: je ne connais pas le format réel de l'un ou l'autre). Une autre façon est d'écrire un chargeur exécutable qui peut comprendre les fichiers PE (par exemple Wine en fournit un) ou un chargeur exécutable qui peut comprendre le fichier ELF (je pense que la conception de Windows limite la possibilité qu'un fichier double-cliquable s'exécute nativement en tant qu'exécutable)

  3. Appels système convention d'appel. Linux et Windows ont non seulement un ensemble différent d'appels système disponibles, mais également une convention d'appel système très différente. Sous Linux, pour passer un appel système, vous passez le numéro d'appel système dans le registre eax / rax et les arguments dans le reste des registres, puis vous faites une demande d'interruption 0x80. Sous DOS, vous passez également des arguments dans le registre, mais il existe un numéro de demande d'interruption différent pour chaque service système, donc vous ne transmettez pas le numéro d'appel système dans eax / rax. Windows NT est plus similaire à Linux, mais au lieu de 0x80, vous lancez une demande d'interruption 0x2E, cependant le numéro d'appel système diffère toujours (vous avez donc besoin d'une table de traduction de numéro syscall et éventuellement d'une couche de compatibilité).

    Solution: même si vous n'avez pas de code auto-modifiable ou si vous essayez d'exécuter des données sous forme de code ou d'autres codes délicats, il est toujours très difficile (aussi difficile que de résoudre le problème de l'arrêt) d'analyser un exécutable, de rechercher tous les systèmes Les appels interrompent les demandes et les traduisent en appels système de la plate-forme cible. Un moyen plus simple consiste à fournir un service d'exécution qui gère les demandes d'interruption du programme et les redirige vers les appels système de la plate-forme cible 3 .

Il y a plusieurs autres raisons, mais je crois que ces trois sont les gros obstacles.

1 la sécurité du système de fichiers vient à l'esprit, il n'y a aucun moyen de traduire entre les bits de sécurité de Linux et l'ACL NTFS de Windows.

2 Windows ne peut pas bifurquer un processus; CreateProcess peut quelque peu être utilisé pour émuler fork, mais il perd la sémantique de copie sur écriture. Il n'y a aucun moyen de créer un processus de copie sur écriture dans Windows.

3 Je crois que Wine fait ça

Lie Ryan
la source
1

Il est possible de chercher du vin

Paul Whelan
la source
paul @ je ne veux pas de vin ... je parle de programmation ... après avoir obtenu un exécutable après la compilation. cet exécutable peut-il s'exécuter à la fois sur Windows et Linux
1
L'article de wikipedia donne des détails de haut niveau sur la raison pour laquelle WINE est requis.
Paul Whelan
1

Uniquement s'il s'agit d'un fichier .Net .exe. J'ai fait une application en VS et compilée sous Windows puis je l'exécute sous Linux

mono myapp.exe

Je sais que ce n'est pas exactement ce que vous recherchez, mais la réponse est que vous pouvez exécuter des fichiers exe sur Linux.

Lukasz Madon
la source
1

La seule façon d'exécuter des exécutables sur Win, Linux (ou même Mac) est d'avoir une sorte de "couche virtuelle" entre les directives assembleur et OS, l'option de lukas de l'exécuter sous Mono est une solution, tout comme la construction d'un Java (ou même un Adobe Air).

Il n'est pas possible de créer des binaires qui s'exécutent en l'état sur plusieurs architectures car le code machine est fortement lié au système d'exploitation et même au matériel, vous devrez peut-être effectuer plusieurs versions pour chaque système / système d'exploitation.

t3mujin
la source