Я компилирую исходный код C, и это исходники моих плагинов для моей системы,
Есть менеджер этих плагинов который сканирует директории на предмет наличия этих файлов.
Как собрать исходный код в бинарник с информацией о том, что это за плагин и за какой функционал он отвечает, так чтобы менеджер видел этот плагин и сразу же не запуская его подтягивал необходимое управление?
Эта информация может теоретически быть зашита в битовую маску самого бинарника, вот только как это сделать при компиляции я не понимаю.
А прям обязательно это в сам бинарник зашивать?
Может проще использовать для плагинов какой-нибудь контейнер (например zip), внутри которого будет и исполняемый код и файл с метаданными?
Варианты на выбор:
- кастомная секция исполняемого файла (через скрипты линкера)
- специальная экспортируемая функция, вызвав которую, сканер плагинов получит информацию
- просто костыльный статический массив байт в коде с некоторой сигнатурой в начале (парсер найдет сигнатуру и извлечет информацию прямо из файла)
- добавить информацию о назначении плагина прямо в имя файла
- ... уверен, можно придумать что-то ещё
Например, просто объявляете некоторый глобальный статический массив данных в коде по типу
unsigned char plugin_info[64] = {0x11, 0x22, 0x33, 0x44, 0x01, 0x03, 0x06 <и другие данные> }
он скомпилируется в последовательность байт в конечном исполняемом файле. Вначале будет сигнатура 11 22 33 44, которую можно найти простым поиском по файлу.
Через __attribute__((section(".somecustomsection"))) можно сказать, чтобы этот массив лежал в отдельной секции, тогда его будет распарсить и найти ещё проще.
что-то похожее нагуглил вот тут https://mgalgs.github.io/2013/05/10/hacking-your-E...
Что до специальных функций, я такое только под Windows делал, из того, что сейчас нагуглил, под линуксом это примерно так же работает:
void* library = dlopen(path, RTLD_NOW|RTLD_GLOBAL); // загружаем плагин
MYFUN* function = (MYFUN*)dlsym(library, "function"); //получаем некоторую его функцию
plugin_info * info = function(); // получаем инфу о плагине из него вызовом этой функции