Могу ли я получить доступ к символам хост-процесса из общего объекта, загруженного во время выполнения? Любая альтернатива? - PullRequest
3 голосов
/ 10 октября 2011

В моем сценарии мне нужен плагин, который является общим объектом, загружаемым во время выполнения, для доступа к символам из «хост-приложения», чтобы я мог добавить любую функциональность в свое приложение.

Я пытался, но не нашел способа сделать это, и я понятия не имею, возможно ли это или нет. Итак, могу ли я сделать это как-нибудь или есть альтернатива, которую используют приложения, использующие плагины?

Я на Fedora 15, Linux 2.6.4. Однако я надеюсь, что решение будет кроссплатформенным.

1 Ответ

3 голосов
/ 10 октября 2011

Существует три основных подхода:

  1. Передать структуру указателей функций в DLL из приложения, предоставляя доступ к любым символам, которыми вы хотите поделиться.Это наиболее переносимый метод, но создавать все указатели на функции довольно сложно.Что-то вроде:

    // In shared header
    struct app_vtable {
      void (*appFoo)();
    };
    
    // In plugin:
    const app_vtable *vt;
    void set_vtable(const app_vtable *vt_) {
      vt = vt_;
    }
    
    void bar() {
      vt->appFoo();
    }
    
    // In application:
    void foo();
    const app_vtable vt = { foo };
    
    void loadplugin() {
      void *plugin = dlopen("plugin.so", RTLD_LAZY);
      void (*pset_vtable)(const app_vtable *) = dlsym(plugin, "set_vtable");
    
      pset_vtable(&vt);
    
      void (*pbar)() = dlsym(plugin, "bar");
      pbar();
    }
    
  2. Переместите ваше приложение в библиотеку, и исполняемый файл просто связывается с этой библиотекой и вызывает точку входа в нее.Тогда ваши плагины могут связывать одну и ту же библиотеку и легко получать доступ к ее символам.Это также довольно переносимо, но может привести к некоторой потере производительности из-за необходимости использовать позиционно-независимый код в основной библиотеке приложения (хотя в этом случае вы можете избежать фиксированного отображения, в зависимости от вашей архитектуры).

  3. Только в Linux (и, возможно, на других платформах ELF) вы можете использовать -rdynamic для прямого экспорта символов из исполняемого файла приложения.Однако это не очень переносимо для других платформ - в частности, это не эквивалентно этому в Windows.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...