Mono AOT Segmentation Fault - Странная проблема - PullRequest
9 голосов
/ 26 декабря 2009

Я хотел протестировать Mono AOT, поэтому я написал простое консольное приложение с MonoDevelop:

using System;

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

Он создал файл с именем "abc.exe" в bin / debug. Когда я пытаюсь сделать:

mono abc.exe

это сработало. Итак, я попытался AOT это. Я сделал:

mono --aot abc.exe

он создал мне файл с именем abc.exe.so. Когда я пытаюсь запустить его, он выдает ошибку «Ошибка сегментации (ядро сброшено)». Вот вывод моно --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.

Как я могу это исправить?

Спасибо.

Ответы [ 3 ]

7 голосов
/ 07 января 2010

То, что Сколима сказал, было правильно, довольно странно, что он получил отрицательное голосование.

Вы не должны использовать выходные данные, сгенерированные компилятором AOT Mono.

Компиляция AOT Mono - это процесс, который кэширует выходные данные компиляции JIT и оставляет их в общей библиотеке, которая загружается средой выполнения Mono по требованию. Создаемый файл .so содержит предварительно скомпилированный код и метаданные, необходимые для использования во время выполнения.

Чтобы использовать файл AOT, вы просто вызываете вашу программу следующим образом:

mono program.exe

Mono загрузит метаданные из program.exe и проверит наличие файла program.exe.so, чтобы избежать своевременной компиляции во время выполнения, и вместо этого использует код из файла .so. Тот же процесс применяется ко всем ссылкам на библиотеки.

Даже в режиме полной статической компиляции Mono создается код, который требует наличия исходного файла .exe.

Если вы хотели получить собственный исполняемый файл, вы можете попробовать команду mkbundle, которая упаковывает среду выполнения Mono и вашу программу в один исполняемый файл.

5 голосов
/ 06 января 2010

Вы не должны запускать выходной файл .so, просто запустите mono на исходном управляемом .exe, и он автоматически подберет файл AOT.

1 голос
/ 26 декабря 2009

Какая у вас среда и моно версия?

AOT работает только на x86, x86-64 и ARM, и только на Linux и, возможно, Mac.

Если вы используете одну из этих платформ и последнюю версию Mono (2.6), то это звучит как ошибка, которую, вероятно, следует отправить по адресу http://www.mono -project.com / Bugs .

...