LINUX.ORG.RU

Кроссплатформенные модули программы


0

1

Задача такова:

Папка программы одинаковая для всех систем
Есть несколько исполняемых файлов для разных платформ.
Например: win32.exe, nix32.app, mac32.app, ...
(для x86-64 скорее всего будут свои модули)

Каждый файл является оболочкой использующей системные функции
для исполнения общего кода разделённого на модули.
Например: graphics, sound, gui, ...

Модули не маленькие поэтому и не хочется вставлять их
в код исполняемых файлов для разных систем.
Необходимо загружать эти модули исполняемыми файлами.

Варианты:
1: Конвертиция какого-то абстрактного формата модуля в dll, so, dylib
и его загрузка стандартными функциями dlopen, LoadLibrary.
2: Самостоятельная загрузка кода как данные,
изменение типа сегмента или секции на исполняемый ( как реализовать? ),
и заполнение адресов функций.
3: По другому...

Как лучше реализовать?

компилировать при запуске в библиотеку нужной платформы :)

Harald ★★★★★
()

Плюсую разные сборки. Ну или в одну сборку напихать dll, so, dylib.

trex6 ★★★★★
()

прежде всего несколько вопросов:

1) ты знаешь о том что такое Qt, которое вероятно решило твою проблему «является оболочкой использующей системные функции» еще 15 лет назад? в самом деле, Qt идеально подходит для платформо-зависимого кода в одном же исходнике (#ifdef Q_WS_X11, Q_WS_MAC, Q_WS_QWS, Q_WS_WIN и так далее)

2) этот пункт «Модули не маленькие поэтому и не хочется вставлять их в код исполняемых файлов для разных систем» зависит от того, какую платформу для своей программы ты используешься, если Python Mono OpenJDK и другие подобные - то считай этот пункт уже решен

просто тебе не хватает кругозора по технологиям, иначе бы вопросы отпали сразу, в общем спрашивай

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

так сказал как будто #ifdef Q_WS_X11 std::cout << «linux!»; #endif

$ ./prog.exe linux!

;)

trashymichael ★★★
()
Ответ на: комментарий от I-Love-Microsoft

1) ты знаешь о том что такое Qt, которое вероятно решило твою проблему «является оболочкой использующей системные функции» еще 15 лет назад? в самом деле, Qt идеально подходит для платформо-зависимого кода в одном же исходнике (#ifdef Q_WS_X11, Q_WS_MAC, Q_WS_QWS, Q_WS_WIN и так далее)

С исходниками проблем нет.
К каждой конфигурации Win, Mac, Nix+X11, Nix+SDL, ... есть свой код
Как-раз этот платформо-зависимый код
и будет выноситься в основные исполняемые файлы.
но желательно, что-бы их размер был минимальный,
а её основной, общий для всех систем функционал, лежал в модулях.

2) этот пункт «Модули не маленькие поэтому и не хочется вставлять их в код исполняемых файлов для разных систем» зависит от того, какую платформу для своей программы ты используешься, если Python Mono OpenJDK и другие подобные - то считай этот пункт уже решен

С++ + Assembler

лучше сделать разные сборки

Плюсую разные сборки. Ну или в одну сборку напихать dll, so, dylib.

Разные сборки создавать не хочется, так как основной смысл всего это-го,
что-бы папка программы на всех системах была одинакова.
Если в одну с сборку напихать dll, so, dylib каждого модуля,
то размеры папки увеличится в несколько раз,
при том что функции содержащиеся в dll, so, dylib будут одинаковы.

компилировать при запуске в библиотеку нужной платформы :)

И наверно лучше осуществить её силами самой программы:
При компиляции создать какой-то бинарный формат библиотеки
с таблицей ссылок на её функции.
И самой программой при запуске создать файл(dll, so, dylib)
формировать заголовок,вычислить ссылки, копировать код.
Может-ли это не понравится антивирусам?

zheland
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Спешить думаю пока не буду, разделить код всегда успею...
Пока-что сделаю сборки с уже включёнными в код модулями.
Собирать отдельные файлы библиотек во время работы программы думаю не буду.
Потом, ближе к результату, посмотрю в сторону mmap и mprotect.

Всем спасибо!

zheland
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.