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 的文件。当我尝试启动它时,它会引发“分段错误(核心转储)”错误。下面是 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 文件的代码。

如果您想要实现的是本机可执行文件,您可以尝试使用 mkbundle 命令将 Mono 运行时和您的程序打包成一个可执行文件。

于 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 回答