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

时间:2018-06-01 00:51:44

标签: libstdc++ dlopen dlsym

我们有一个最小的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 :(得分:1)

  

除了库指针返回NULL

外,没有报告错误

库指针无法返回任何内容。您可能意味着dlopen()会返回NULL

如果这就是你的意思,报告的错误。如果您想了解有关为什么错误的详细信息,请使用dlerror()查找。