【问题标题】:Mono AOT Segmentation Fault - Strange ProblemMono AOT 分段错误 - 奇怪的问题
【发布时间】:2010-12-30 01:18:18
【问题描述】:

我想测试 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.

我该如何解决?

谢谢。

【问题讨论】:

    标签: c# mono aot


    【解决方案1】:

    skolima 说的是对的,他被否决了,这很奇怪。

    您不应该直接使用 Mono 的 AOT 编译器生成的输出。

    Mono 的 AOT 编译是一个缓存 JIT 编译的输出并将其留在共享库中的过程,该共享库由 Mono 运行时按需加载。生成的 .so 文件包含预编译代码和运行时需要使用的元数据。

    要使用 AOT 文件,您只需像这样调用您的程序:

    单声道程序.exe

    Mono 将从 program.exe 加载元数据并探测是否存在 program.exe.so 以避免在运行时进行即时编译,而是使用 .so 文件中的代码。相同的过程适用于任何引用的库。

    即使是 Mono 的完全静态编译模式,生成的代码也需要存在原始 .exe 文件。

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

    【讨论】:

      【解决方案2】:

      您不应该启动输出 .so 文件,只需在原始托管 .exe 上运行 mono,它会自动获取 AOT 文件。

      【讨论】:

        【解决方案3】:

        你的环境和 Mono 版本是什么?

        AOT 仅适用于 x86、x86-64 和 ARM,并且仅适用于 Linux 和 Mac。

        如果您使用这些平台之一并且使用最新的 Mono 版本 (2.6),那么这听起来像是一个错误,可能应该在 http://www.mono-project.com/Bugs 提交。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-22
          • 1970-01-01
          • 2019-08-18
          • 1970-01-01
          相关资源
          最近更新 更多