2009-12-25 61 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文件。