9

Mono AOT をテストしたかったので、MonoDevelop で簡単なコンソール アプリケーションを作成しました。

using System;

namespace abc
{
    public class Program
    {
        public static void Main()
        {
            Console.WriteLine("Hello World!");
        }
    }
}

bin/debug に「abc.exe」という名前のファイルが作成されました。私がやろうとすると:

mono abc.exe

出来た。というわけでAOTしてみました。やった:

mono --aot abc.exe

abc.exe.so という名前のファイルが作成されました。起動しようとすると、「Segmentation fault (core dumped)」エラーがスローされます。mono --aot の出力は次のとおりです。

Code: 51 Info: 5 Ex Info: 8 Unwind Info: 31 Class Info: 30 PLT: 2 GOT Info: 11 GOT Info Offsets: 16 GOT: 20 Offsets: 48
Compiled 2 out of 3 methods (66%)
1 methods have other problems (33%)
Methods without GOT slots: 1 (33%)
Direct calls: 0 (100%)
JIT time: 1 ms, Generation time: 0 ms, Assembly+Link time: 0 ms.

どうすれば修正できますか?

ありがとう。

4

3 に答える 3

7

スコリマの言ったことは正しかった。

Mono の AOT コンパイラによって生成された出力を直接使用することは想定されていません。

Mono の AOT コンパイルは、JIT コンパイルの出力をキャッシュし、必要に応じて Mono ランタイムによって読み込まれる共有ライブラリに残すプロセスです。生成される .so ファイルには、事前にコンパイルされたコードと、ランタイムで使用するために必要なメタデータが含まれています。

AOT ファイルを使用するには、次のようにプログラムを呼び出すだけです。

モノプログラム.exe

Mono は、program.exe からメタデータを読み込み、program.exe.so の存在をプローブして、実行時にジャストインタイム コンパイルを実行することを回避し、代わりに .so ファイルのコードを使用します。参照されるすべてのライブラリに同じプロセスが適用されます。

Mono の完全な静的コンパイル モードでさえ、元の .exe ファイルの存在を必要とするコードを生成します。

実現したいものがネイティブの実行可能ファイルである場合は、Mono ランタイムとプログラムを単一の実行可能ファイルにパッケージ化する mkbundle コマンドを試すことができます。

于 2010-01-07T06:52:49.047 に答える
5

出力 .so ファイルを開始するべきではありません。元のマネージド .exe で mono を実行するだけで、AOT ファイルが自動的に取得されます。

于 2010-01-06T13:54:04.370 に答える
1

あなたの環境とMonoのバージョンは何ですか?

AOT は x86、x86-64、および ARM でのみ動作し、Linux および場合によっては Mac でのみ動作します。

これらのプラットフォームのいずれかで最新の Mono バージョン (2.6) を使用している場合、バグのように思えますが、おそらくhttp://www.mono-project.com/Bugsに報告する必要があります。

于 2009-12-26T02:21:18.113 に答える