2009-12-25 18 views
9

ho voluto mettere alla prova Mono AOT, così ho scritto una semplice applicazione console con MonoDevelop:Mono AOT Segmentation Fault - strano problema

using System; 

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

ha creato un file denominato "abc.exe" in bin/debug. Quando provo a fare:

mono abc.exe 

ha funzionato. Quindi, ho provato ad AOT it. Ho fatto:

mono --aot abc.exe 

mi ha creato un file denominato abc.exe.so. Quando provo ad avviarlo, genera un errore "Segmentation fault (core dumped)". Ecco l'output di 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. 

Come posso risolvere il problema?

Grazie.

risposta

7

Ciò che Skolima ha detto era giusto, è piuttosto strano che sia stato sottosopra.

Non si deve utilizzare direttamente l'output generato dal compilatore AOT di Mono.

La compilazione AOT di Mono è un processo che memorizza nella cache l'output della compilazione JIT e lo lascia in una libreria condivisa caricata su richiesta dal runtime Mono. Il file .so che viene generato contiene il codice precompilato ei metadati necessari per essere utilizzati dal runtime.

Per utilizzare il file AOT, basta richiamare il vostro programma come questo:

mono program.exe

Mono caricherà i metadati da program.exe e sonda per l'esistenza di un program.exe. per evitare di eseguire la compilazione just-in-time in fase di esecuzione e utilizzare invece il codice dal file .so. Lo stesso processo è applicato a tutte le librerie referenziate.

Anche la modalità di compilazione statica completa di Mono produce codice che richiede la presenza del file .exe originale.

Se ciò che si voleva ottenere era un eseguibile nativo, si poteva provare il comando mkbundle che raggruppa il runtime Mono e il programma in un singolo eseguibile.

1

Qual è il tuo ambiente e la versione mono?

AOT funziona solo su x86, x86-64 e ARM, e solo su Linux e forse Mac.

Se ci si trova su una di queste piattaforme e sull'ultima versione Mono (2.6), sembra un errore che dovrebbe probabilmente essere archiviato allo http://www.mono-project.com/Bugs.

5

Non si dovrebbe avviare il file .so di output, basta eseguire mono sul file .exe originale e verrà prelevato automaticamente il file AOT.