.exeLinuxでWindows ファイルを実行できますか?
同じアーキテクチャを使用することは可能ですか?両方のプログラムがX86アーキテクチャで実行される場合、.exeLinuxでWindowsを実行することは可能ですか?
.exeLinuxでWindows ファイルを実行できますか?
同じアーキテクチャを使用することは可能ですか?両方のプログラムがX86アーキテクチャで実行される場合、.exeLinuxでWindowsを実行することは可能ですか?
回答:
exeファイルはLinuxまたはWindowsで実行されますが、両方ではありません。
Windowsで実行
ファイルがWindowsファイルの場合、Linux自体では実行されません。その場合は、Windows互換性レイヤー(ワイン)で実行してみてください。wineと互換性がない場合、Linuxで実行することはできません。
開始する前に、Wineをインストールする必要があります。Wineのインストールに必要な手順は、お使いのLinuxプラットフォームによって異なります。たとえば、Ubuntuをインストールしている場合は、Googleで「Ubuntu install wine」を使用できます。
wineをインストールしたら、これらのコマンドを実行できるようになります。
wine xxx.exe
Linuxで実行する
このファイルをLinuxで実行することがわかっている場合は、次のコマンドを実行する必要があります。
あなたはeまで、すべてのユーザーが許可する権限を変更したいと思うのx ecuteこのファイルを(+ X)。ユーザーにe x ecute(u + x)だけを許可することもできます
chmod a+x xxx.exe
プログラムを起動する./と、実行するファイルの現在のパスを検索するようにコマンドラインに指示します( 'current'ディレクトリが$ PATH環境変数にない場合)。
./xxx.exe
オペレーティングシステム(WindowsまたはLinux)は、アプリケーションにサービスを提供します。たとえば、WindowsおよびLinuxには、アプリケーションがファイルにアクセスしたり、ネットワークにアクセスしたり、画面に表示したりするために呼び出すことができる機能があります。
オペレーティングシステムが異なれば、これらのことを行う方法も異なります。そのため、CPUアーキテクチャが同じであっても、Windowsでそれを行うアプリケーションはLinuxで動作しません。
.exeファイルがLinuxで直接実行されない理由と、Linux実行可能ファイルがWindowsで直接実行されない理由は3つあります。
最初はシステムコールです。システムコールは、ほぼ定義上、プラットフォーム固有です。ただし、すべてのシステムコールが同じになるわけではありません。ポータブルシステムコール(例:C / C ++標準ライブラリで定義)と非ポータブルシステムコール(例:POSIXまたはMicrosoftで定義)があります。コンパイル時にシステムライブラリと静的にリンクされているアプリケーションは、プラットフォームの設計が大きく異なるため、静的に含まれているコードの一部がターゲットプラットフォームで正しく実行される可能性がないことを発見します。実行時に動的にリンクされるアプリケーションは、いくつかの条件で実行される可能性があります。ポータブルシステムコールの場合、元のバイナリのシステムコールとターゲットプラットフォームのシステムコールの間に変換テーブルがあります。移植性のないシステムコールの場合、1、プラットフォームごとに異なる機能セットがあり、一部の機能は他のプラットフォームでは意味がありません2)。
解決策:LinuxでWindowsプログラムを実行するために、WineはWindowsシステムコールとWindowsシステムライブラリの実装を提供し、PEフォーマットも認識します。Wineは、再コンパイルせずにLinuxでWindowsプログラムを実行できます。WindowsのLinuxプログラムの場合、CygwinはWindowsでPOSIXシステムコールの実装を提供し、Cygwin GCCを使用してLinux用に作成されたプログラムをソースコードを変更せずにWindowsシステムで実行できるようにします。ほとんどのLinuxプログラムはオープンソースであるため、Wineのバイナリ互換レイヤーを提供する方法よりも、再コンパイルする方が簡単です。ワインのような互換性レイヤーを提供することは不可能ではありませんが、Cygwinの方法はより堅牢であり、非オープンソースのLinuxプログラムをWindowsに簡単に移植できるようにするためのドライブはあまりありません。
もう1つは、実行可能形式です。WindowsはPE(Portable Executable)形式を使用し、LinuxはELF(Executable and Linkable Format)を使用します。実行可能形式にはメタデータが含まれており、プラットフォームによる実行可能ファイルのロード方法と実行方法が定義されています。
解決策:PE-> ELFまたはELF-> PEコンバーターを記述することは完全に可能です。おそらくそれほど難しいことではないはずです(警告:私はどちらの実際のフォーマットにも精通していません)。別の方法は、PEファイルを理解できる実行可能ローダー(たとえば、Wineが提供する)またはELFファイルを理解できる実行可能ローダーを作成することです(Windowsの設計により、ダブルクリック可能なファイルが実行可能ファイルとしてネイティブに実行される可能性が制限されると思います)
システムは呼び出し規約を呼び出します。LinuxとWindowsには、使用可能なシステムコールの異なるセットがあるだけでなく、非常に異なるシステムコール呼び出し規則もあります。Linuxでは、システムコールを行うために、eax / raxレジスタでsyscall番号を渡し、残りのレジスタで引数を渡してから、0x80割り込み要求を行います。DOSでは、レジスタで引数も渡しますが、システムサービスごとに異なる割り込み要求番号があるため、eax / raxでシステムコール番号を渡しません。Windows NTはLinuxに似ていますが、0x80の代わりに0x2E割り込み要求を発生させますが、システムコール番号は依然として異なります(したがって、システムコール番号変換テーブルと互換性レイヤーが必要です)。
解決策:自己修正コードがない場合や、データをコードとして実行したり、他のトリッキーなコードを実行したりする場合でも、実行可能ファイルを分析し、すべてのシステムを検索するのは非常に困難です(停止問題を解決するのと同じくらい難しい)割り込み要求を呼び出し、それらをターゲットプラットフォームのシステムコールに変換します。より簡単な方法は、プログラムの割り込み要求を処理し、それらをターゲットプラットフォームのシステムコール3にリダイレクトするランタイムサービスを提供することです。
他にもさまざまな理由がありますが、これら3つが大きな障害だと思います。
1ファイルシステムのセキュリティが思い浮かびます。LinuxのセキュリティビットとWindowsのNTFS ACLを変換する方法はありません。
2 Windowsはプロセスをフォークできません。CreateProcessはフォークをエミュレートするために多少使用できますが、コピーオンライトセマンティックを失います。Windowsでコピーオンライトプロセスを作成する方法はありません。
3ワインはこれを行うと信じています