dlopen не работает в библиотеке, создающей экземпляр объекта - PullRequest
0 голосов
/ 01 июня 2018

У нас есть минимальный рабочий пример dlopen, который работает.

void* lib = dlopen("servlets.so", RTLD_NOW);
void* p = dlsym(lib, "getServlets");

Однако, если мы добавим еще одну функцию в общую библиотеку (даже если она не вызывается), библиотека не будет работать (даже если код никогда не вызывается)

uint32_t count = 0;
Servlet** servlets;
extern "C" {
  void generate() {
     servlets = new Servlet*[3];
     servlets[0] = new Servlet(...);
  }
  Servlet** getServlets() { return servlets; }
  uint32_t getServletNum() { return count; }
}

Это должно быть потому, что код в общем объекте ссылается на некоторый символ, которого у нас нет, но мы не знаем, что.Код компилируется и связывается без проблем.

  1. Есть ли способ узнать, в чем ошибка?Об ошибках не сообщается, за исключением того, что указатель библиотеки возвращает NULL, а библиотека не загружается.

  2. Как нам связать библиотеку, чтобы dlopen работал?

1 Ответ

0 голосов
/ 03 июня 2018

Об ошибках не сообщается, за исключением того, что указатель библиотеки возвращает NULL

Указатель библиотеки не может вернуть что-либо.Вы, вероятно, имеете в виду dlopen() возвращает NULL.

Если это то, что вы имеете в виду, , то есть сообщаемая ошибка.Если вы хотите узнать больше о , почему была возвращена ошибка, используйте dlerror(), чтобы узнать.

...