2009-12-25 24 views
9

quería probar Mono AOT, así que escribió una simple aplicación de consola con MonoDevelop:Mono AOT Segmentación de fallas - extraño problema

using System; 

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

Se crea un archivo llamado "abc.exe" en bin/debug. Cuando trato de hacer:

mono abc.exe 

funcionó. Entonces, traté de AOT. Lo hice:

mono --aot abc.exe 

me creó un archivo llamado abc.exe.so. Cuando trato de iniciarlo, arroja un error de "Fallo de segmentación (núcleo volcado)". Aquí está la salida del 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ómo puedo solucionarlo?

Gracias.

Respuesta

7

Lo que dijo skolima era correcto, es bastante extraño que haya sido votado negativamente.

Se supone que no debe usar directamente la salida generada por el compilador AOT de Mono.

La compilación AOT de Mono es un proceso que almacena en caché el resultado de la compilación JIT y lo deja en una biblioteca compartida cargada por el tiempo de ejecución Mono bajo demanda. El archivo .so que se genera contiene el código precompilado y los metadatos necesarios para ser consumidos por el tiempo de ejecución.

Para utilizar el archivo AOT, que acaba de invocar el programa de la siguiente manera:

mono program.exe

Mono cargará los metadatos de program.exe y la sonda de la existencia de un program.exe. para evitar hacer compilación justo a tiempo en el tiempo de ejecución, y en su lugar usar el código del archivo .so. El mismo proceso se aplica a las bibliotecas a las que se hace referencia.

Incluso el modo de compilación estática completa de Mono produce código que requiere que esté presente el archivo .exe original.

Si lo que quería lograr era un ejecutable nativo, podría probar el comando mkbundle que empaqueta el tiempo de ejecución Mono y su programa en un único ejecutable.

1

¿Cuál es su entorno y la versión Mono?

AOT solo funciona en x86, x86-64 y ARM, y solo en Linux y tal vez en Mac.

Si está en una de estas plataformas y en la última versión de Mono (2.6), entonces suena como un error que probablemente debería archivarse en http://www.mono-project.com/Bugs.

5

No debe iniciar el archivo .so de salida, simplemente ejecute mono en el .exe administrado original y recogerá automáticamente el archivo AOT.

Cuestiones relacionadas