Доступ к списку символов в плагине

Я использую libltdl для того, чтобы динамически загружать библиотеки плагинов. Следовал этой документации, и после того, как я позвоню

lt_dlhandle lt_dlopen (const char *filename)

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

void * lt_dlsym (lt_dlhandle handle, const char *name)

Что требует имени символа в качестве аргумента.

Как получить списки загружаемых экспортируемых символов в моем плагине?

1 ответ

Решение

Как сказал Matthieu M. в своем комментарии, нет никакого собственного способа получить список загруженных символов из динамической библиотеки.

Тем не менее, я обычно использую этот обходной путь, чтобы ваш плагин объявлял символы в контейнере, а затем извлекал этот контейнер из вашей основной программы.

plugin.h

#include <set>
#include <string>

// call this method from your main program to get list of symbols:
const std::set<std::string> & getSymbols();

void MySymbol01();
bool MySymbol02(int arg1, char arg2);

plugin.c

#include "plugin.h"

class SymbolDeclarator {
    public:
    static std::set<std::string> symbols;
    SymbolDeclarator(const std::string & symbol) {
        symbols.insert(symbol);
    }
};

const std::set<std::string> & getSymbols() {
    return SymbolDeclarator::symbols;
}

#define SYMBOL(RETURN, NAME) \
    static const SymbolDeclarator Declarator##NAME(#NAME); \
    RETURN NAME

SYMBOL(void, MySymbol01)() {
    // write your code here
}

SYMBOL(bool, MySymbol02)(int arg1, char arg2) {
    // write your code here
}

Я вижу только 2 проблемы с этим решением:

  1. иметь неконстантную статическую переменную: symbols объявлено в plugin.c -> не является потокобезопасным.
  2. иметь код, выполняемый перед main(), который трудно отладить.
Другие вопросы по тегам