Большое Счастье: другие произведения.

Как выполнить код на Assembler из кода C# под Linux

Журнал "Самиздат": [Регистрация] [Найти] [Рейтинги] [Обсуждения] [Новинки] [Обзоры] [Помощь]
Peклaмa:
Литературные конкурсы на Litnet. Переходи и читай!
Конкурсы романов на Author.Today

Продавай произведения на
Peклaмa
 Ваша оценка:
  • Аннотация:
    Запуск кода на ассемблере из си шарп.

Для работы понадобится ОС Linux и установленные в ней компиляторы gcc, g++. Проверить наличие компилятора можно командой whereis, а установить - командой sudo apt install в терминале. Имеется простейший код на GNU Assembler, возвращающий 1 (файл asm.s):
.text
   .globl _new
   _new: 
   mov $1,%rax              
   ret
Хотим запустить его в C# с помощью PInvoke. Для этого потребуется промежуточная динамическая библиотека на языке C с кодом (файл my.c):
        #define EXPORT __attribute__((visibility("default")))
        EXPORT int foo(void);
        int foo(void)
        {
            extern int _new();
            return _new();
        }
Эти два файла нужно собрать в shared library (файл lib.so) командой
gcc -shared -fpic -o lib.so my.c asm.s
Полученный файл lib.so нужно подложить в папку с исполняемым файлом результирующей программы на C#. У меня это подкаталог проекта /bin/Debug/netcoreapp3.1/. Код на C# для запуска функции _new выглядит так:
    using System.Runtime.InteropServices;
    class Program{
    [DllImport("lib.so")] public static extern int foo ();
     static void Main(string[] args)
            {
                int code = foo();
    System.Console.WriteLine(code);
    }
    }
Запускается он командой dotnet run, если у вас установлена исполняемая среда .NET Core. В консоли вы увидите 1. Чтобы добавить прослойку между C# и C в виде кода на C++, нужно добавить в проект файл my.cpp с кодом:
   extern "C"{
        #define EXPORT __attribute__((visibility("default")))        
        EXPORT int foocpp(void)
        {
            extern int foo();
            return foo();
        }}
и заменить в коде C# название внешней функции foo на foocpp. Тогда изменится команда сборки и будет выглядеть так:
g++ -shared -fpic -o lib.so my.cpp -x c my.c -x assembler asm.s
После чего запускаем dotnet run и видим 1 в консоли.

 Ваша оценка:

Популярное на LitNet.com Л.Джейн "Чертоги разума. Книга 1. Изгнанник "(Антиутопия) Д.Маш "Золушка и демон"(Любовное фэнтези) Д.Дэвлин, "Особенности содержания небожителей"(Уся (Wuxia)) Д.Сугралинов "Дисгардиум 2. Инициал Спящих"(ЛитРПГ) А.Чарская "В плену его демонов"(Боевое фэнтези) М.Атаманов "Искажающие Реальность-7"(ЛитРПГ) А.Завадская "Архи-Vr"(Киберпанк) Н.Любимка "Черный феникс. Академия Хилт"(Любовное фэнтези) К.Федоров "Имперское наследство. Забытый осколок"(Боевая фантастика) В.Свободина "Эра андроидов"(Научная фантастика)
Связаться с программистом сайта.

Новые книги авторов СИ, вышедшие из печати:
Э.Бланк "Колечко для наследницы", Т.Пикулина, С.Пикулина "Семь миров.Импульс", С.Лысак "Наследник Барбароссы"

Как попасть в этoт список
Сайт - "Художники" .. || .. Доска об'явлений "Книги"