Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用libtool从共享库加载重复的函数名_C++_Shared Libraries_Libtool - Fatal编程技术网

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

C++ 使用libtool从共享库加载重复的函数名,c++,shared-libraries,libtool,C++,Shared Libraries,Libtool,我试图创建一个“调试”共享库(即.so或.dll文件),它调用另一个“真实”共享库,该共享库与调试库具有相同的C API(在本例中,是为了模拟PKCS#11 API)。但是,我遇到了麻烦,调试库的链接映射与实际库的链接映射冲突,导致调试库调用自己的函数,而不是实际库中相应的函数。我通过使用POSIX dlmopen命令找到了这个问题的解决方案,但我想了解一下,使用GNU的libtool是否可以实现同样的功能 在我的Solaris 10系统上,当测试应用程序静态链接到调试库时,以下代码使断言失败:

我试图创建一个“调试”共享库(即.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)();
}
不幸的是,dlmopen似乎没有包含在libtool中(即,我在libtool中没有看到lt_dlmopen函数)


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

我还没有找到使用libtool解决此问题的好方法,但是有一种方法可以通过使用带有以下标志的dlopen来避免Solaris特定的“dlmopen”函数:

void *handle = dlopen("realsharedlibrary.so", RTLD_NOW | RTLD_GROUP | RTLD_LOCAL)
显然,通过使用
RTLD\u NOW
而不是
RTLD\u LAZY
以及通过添加
RTLD\u组
解决了符号冲突问题。之所以存在
RTLD_LOCAL
,是因为POSIX要求使用
RTLD_LOCAL
RTLD_GLOBAL
,或者行为未定义。对于Solaris,行为默认为
RTLD\u LOCAL

然而,悬而未决的问题是,是否有可能将这些类型的标志传递给ltdluopen

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