Я хотел протестировать Моно 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.
Как я могу зафиксировать его?
Спасибо.
То, что сказал Сколима был прав, довольно странно, что он проголосовал вниз.
Вы не должны напрямую использовать выходные данные, сгенерированные компилятором Mono's AOT.
Mono's AOT компиляция - это процесс, который кэширует выходные данные JIT компиляции и оставляет их в общей библиотеке, которая загружается во время выполнения Mono по требованию. Генерируемый файл .so содержит предварительно скомпилированный код и метаданные, необходимые для использования во время выполнения.
Чтобы использовать AOT-файл, вы просто вызываете свою программу следующим образом:
mono program.exe
Mono загрузит метаданные из program.exe и проверит наличие программы.exe.so, чтобы избежать выполнения компиляции во время выполнения, и вместо этого использует код из .so-файла. Тот же самый процесс применяется к любым библиотекам, на которые ссылаются.
Даже полный статический режим компиляции Mono производит код, который требует наличия оригинального .exe файла.
Если то, что вы хотели получить - это исходный исполняемый файл, вы можете попробовать команду mkbundle, которая упаковывает время выполнения Mono и вашу программу в один исполняемый файл.
.Не следует запускать вывод .so файла, просто запустите mono на оригинальном управляемом .exe, и он автоматически заберет AOT-файл.
Какое у вас окружение и версия Mono?
AOT работает только на x86, x86-64 и ARM, и только на Linux и, возможно, на Mac.
Если вы находитесь на одной из этих платформ и на последней версии Mono (2.6), то это похоже на ошибку, которую, вероятно, следует зарегистрировать по адресу http://www.mono-project.com/Bugs.
.