Моно отказ сегментации AOT - странная проблема

Я хотел протестировать Моно AOT, таким образом, я записал простое консольное приложение с MonoDevelop:

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. Когда я пытаюсь запустить его, это бросает "Отказ сегментации (выведенное ядро)" ошибка. Вот вывод моно - 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.

Как я могу зафиксировать его?

Спасибо.

9
задан Alon Gubkin 25 December 2009 в 23:44
поделиться

3 ответа

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

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

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

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

mono program.exe

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

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

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

.
7
ответ дан 4 December 2019 в 15:20
поделиться

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

5
ответ дан 4 December 2019 в 15:20
поделиться

Какое у вас окружение и версия Mono?

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

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

.
1
ответ дан 4 December 2019 в 15:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: