dlopen 在实例化对象的库中失败

dlopen fails in a library instantiating an object

我们有一个 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; }
}

这一定是因为共享对象中的代码引用了一些我们没有的符号,但我们不知道是什么。 代码编译 links 没有问题。

  1. 有什么方法可以查出错误是什么?没有报错,只是库指针returnsNULL,库没有加载

  2. 我们如何 link 到库以便 dlopen 工作?

No error is reported, except that the library pointer returns NULL

库指针不能return任何东西。你可能是说 dlopen() returns NULL.

如果这就是您的意思,那就是报告的错误。如果您想进一步了解 为什么 错误是 returned,请使用 dlerror() 找出答案。