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