Библиотека, загруженная с помощью dlopen, не будет закрыта - PullRequest
0 голосов
/ 09 июня 2019

У меня проблемы с выяснением, как выполнить следующее:

  1) Load in a library from libraryA.so,
  2) Call the 'main' function
  3) Unload the library.

В частности, я не могу заставить шаг 3 работать надежно.

Моя библиотека LibraryA была скомпилирована следующим образом:

  g++ libraryA.c -o libraryA.so -shared -llibraryB

Вот что происходит, когда я загружаю библиотеку A:

  void* libA = dlopen("./libraryA.so", RTLD_NOW | RTLD_DEEPBIND)

Приведенная выше команда загружается в libraryA из "libraryA.so", который, в свою очередь, загружает libraryB из "/usr/local/lib/libraryB.so".

Однако, похоже, существует циклическая зависимость между libraryA и libraryB. (Возможно, из-за использования виртуальных функций.) Запуск с параметром "LD_DEBUG = bindings" показывает такие вещи, как:

  binding file ./libraryA.so [0] to /usr/local/lib/libraryB.so [0]: normal symbol `_ZN55ArrayLJKiLi1EFD2Ef'
  ...
  binding file /usr/local/lib/libraryB.so [0] to ./libraryA.so [0]: normal symbol `_ZN55ArrayIKiLi1EED1Ev'

Из-за этой циклической зависимости libraryA не будет загружаться, когда я вызываю dlclose. Есть ли способы обойти это? Могу ли я в любом случае заставить библиотеку вместе со всеми автоматически загруженными зависимостями выгружаться вместе?

Большое спасибо,

Patrick

...