使用libtool从共享库加载重复的函数名称

时间:2009-11-11 16:41:30

标签: c++ shared-libraries libtool

我正在尝试创建一个'debug'共享库(即.so或.dll文件),该库调用另一个与调试库具有相同C API的“真正”共享库(在这种情况下,用于模拟) PKCS#11 API)。但是,我遇到了麻烦,调试库的链接映射与真实库的链接映射冲突,导致调试库调用自己的函数而不是真实库中的相应函数。我通过使用POSIX dlmopen命令找到了解决这个问题的方法,但是想了解使用GNU的libtool是否可以实现这一点。

在我的Solaris 10系统上,当测试应用程序静态链接到调试库时,以下代码无法断言:

#include <dlfcn.h>
int MyFunctionName() {
  int (*function_ptr)();
  void *handle = dlopen("realsharedlibrary.so", RTDL_LAZY);
  *(void **)(&function_ptr) = dlsym(handle, "MyFunctionName");
  ASSERT(function_ptr != MyFunctionName); // Fails
  return (*function_ptr)();
}

在这种情况下,我得到一个函数指针,指向本地'MyFunctionName'(在调试库中)而不是真实共享库中的MyFunctionName。

我发现通过使用命令'dlmopen'而不是'dlopen'来解决这个问题,并告诉dlmopen在加载时创建一个新的链接映射(带有LM_ID_NEWLM参数)真正的图书馆:

int MyFunctionName() {
  int (*function_ptr)();
  void *handle = dlmopen(LM_ID_NEWLM, "realsharedlibrary.so", RTDL_LAZY);
  *(void **)(&function_ptr) = dlsym(handle, "MyFunctionName");
  ASSERT(function_ptr != MyFunctionName); // succeeds
  return function_ptr(); // call real function
}

不幸的是,dlmopen似乎没有包含在libtool中(即,我没有在libtool中看到lt_dlmopen函数)。

是否可以使用libtool命令执行相同的操作 - 也就是说,在加载新库时创建新的链接映射以使其不会与调试库的链接映射冲突?

1 个答案:

答案 0 :(得分:1)

我还没有找到使用libtool来解决这个问题的好方法,但是有一种方法可以通过使用dlopen来避免特定于Solaris的'dlmopen'函数:

void *handle = dlopen("realsharedlibrary.so", RTLD_NOW | RTLD_GROUP | RTLD_LOCAL)

显然,使用RTLD_NOW代替RTLD_LAZY并添加RTLD_GROUP可以解决符号冲突问题。 RTLD_LOCAL存在,因为POSIX需要使用RTLD_LOCALRTLD_GLOBAL,或者行为未定义。对于Solaris,行为默认为RTLD_LOCAL

但问题是,是否可以将这些类型的标志传递给lt_dlopen。