2009-12-25 64 views
9

我想考单AOT,所以我写了一个简单的控制台应用程序使用的MonoDevelop:单AOT段错误 - 奇怪的问题

using System; 

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

它创造了在斌/调试命名为“abc.exe”文件。当我尝试做:

mono abc.exe 

它的工作。所以,我试着去AOT它。我做了:

mono --aot abc.exe 

它创建了一个名为abc.exe.so的文件。当我尝试启动它时,它会引发“分段错误(核心转储)”错误。下面是单声道输出:

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. 

我该如何解决?

谢谢。

回答

7

斯科利马说了些什么是对的,他投票表决很不可思议。

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

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

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

单的Program.exe

单将负荷的Program.exe和探针元数据的Program.exe文件的存在。所以为了避免在运行时进行即时编译,而是使用.so文件中的代码。相同的过程适用于任何引用的库。

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

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

1

什么是您的环境和单声道版本?

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

如果你使用的是这些平台和最新的Mono版本(2.6),那么它听起来像是一个应该在http://www.mono-project.com/Bugs上提交的bug。

5

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