У нас есть минимальный рабочий пример 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; }
}
Это должно быть потому, что код в общем объекте ссылается на некоторый символ, которого у нас нет, но мы не знаем, что.Код компилируется и связывается без проблем.
Есть ли способ узнать, в чем ошибка?Об ошибках не сообщается, за исключением того, что указатель библиотеки возвращает NULL, а библиотека не загружается.
Как нам связать библиотеку, чтобы dlopen работал?