LinuxはC#でコンパイルされたこのexeをどのようにロードしますか? [コピー]

LinuxはC#でコンパイルされたこのexeをどのようにロードしますか? [コピー]

私は非常に驚くべき事実を見つけました。

cscWindowsコンピュータ(Visual Studioで)から単純なC#hello worldをコンパイルし、結果exeファイルをLinuxコンピュータにコピーしてからmono helloworld.exeこの投稿Windowsでは、デフォルトでhelloworld.exeはC#ランタイムを開始するトリックだけであり、CILバイトコードはファイルの後半の一部のデータ部分から読み取られますexe。同様に、Linuxでは、mono helloworld.exeexeのなりすましを心配することなくC#ランタイムを実行し、バイトコードを直接読み取ることができると思います。

子孫のために私がソースにした内容は次のとおりです。Charles Petzoldによる優れた無料C#ブック:

//---------------------------------------------
// FirstProgram.cs (c) 2006 by Charles Petzold
//---------------------------------------------
class FirstProgram
{
    public static void Main()
    {
        System.Console.WriteLine("Hello, Microsoft .NET Framework!");
    }
}

しかし興味深い点は次のとおりです。 Linux(uname -rマイコンピュータ4.14.188-1-MANJARO)では、単に実行すると./helloworld.exe機能します!

私はいくつかの調査を始めました、そしてそれは私が実行したものの最初の数行ですstrace ./helloworld.exe

execve("./hw.exe", ["./hw.exe"], 0x7fffae8e6070 /* 61 vars */) = 0
[ Process PID=3381 runs in 32 bit mode. ]
brk(NULL)                               = 0x7eedb000
arch_prctl(0x3001 /* ARCH_??? */, 0xffb19948) = -1 EINVAL (Invalid argument)
readlink("/proc/self/exe", "/usr/bin/wine", 4096) = 13
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf7faa000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/bin/../lib32/tls/i686/sse2/libwine.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/usr/bin/../lib32/tls/i686/sse2", 0xffb18e00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/bin/../lib32/tls/i686/libwine.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/usr/bin/../lib32/tls/i686", 0xffb18e00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/bin/../lib32/tls/sse2/libwine.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/usr/bin/../lib32/tls/sse2", 0xffb18e00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/bin/../lib32/tls/libwine.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/usr/bin/../lib32/tls", 0xffb18e00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/bin/../lib32/i686/sse2/libwine.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/usr/bin/../lib32/i686/sse2", 0xffb18e00) = -1 ENOENT (No such file or directory)

私はLinuxプログラムローダーがWindowsのPE形式ではなくELFファイルだけを理解したいので、「このファイルは有効な実行ファイルではありません」というエラーが発生すると予想しました。代わりに、システムはワインの検索を開始するのに十分賢いようです(出力からstraceワインライブラリの検索を開始することがわかり、Linuxシステムにすでにwineがインストールされているので、最終的にはワインを探します)。

どうしたの?execvePEファイルが検出されたら、ワインを試してみるのと同じくらいスマートな呼び出しですか、それともこれがbash行われていますか?それとも全く違うのですか?

答え1

パッケージマネージャを介してWineまたはMonoをインストールする必要があり、exeファイルを起動した後に実行する操作をカーネルに通知する特別な設定ファイルが付属しています。

詳細については、ここをクリックしてください。https://en.wikipedia.org/wiki/Binfmt_misc

関連情報