我有一个共享库,我在初始化例程中执行了(尝试了RTLD_LAZY和RTLD_NOW)。从此返回的句柄存储在一个全局void指针中(这在头文件abc.h中定义为extern)
与我的初始化例程在同一个库中的另一个API使用句柄来查找符号并调用API。但是从我看到的,作为第二个API的一部分从dlsym返回的指针与我在初始化API期间检查的指针不同。它看起来像下面的东西。
include <stdio.h>
include <dlfcn.h>
include "init.h"
void *global_handle=NULL;
int init_api()
{
global_handle = dlopen('xyz.so.1.0.1',RTLD_LAZY);
printf("[DEBUG]: global handle from my init %p", global_handle);
printf("[DEBUG]: dlsym xyz from my init from global handle=%p",
dlsym(global_handle, 'abc'));
return 0;
}
extern void *global_handle;
#include <dlfcn.h>
#include init.h
int my_api()
{
int (*api)(int*);
int a = 5;
*(void**)(&api) = dlsym(global_handle,'abc');
printf("[DEBUG]: global handle in my api=%p", global_handle);
printf("[DEBUG]: dlsym xyz from my api using global handle=%p",
api);
int rc = (*api)(&a); /* >>>>> segfault on this call */
printf("RC : %d", rc);
return rc;
}
xyz.so包含符号abc。我使用
验证了这一点strings xyz.so | grep abc
关于可能导致此问题的原因的任何线索都会非常有用吗?
[DEBUG]: global handle from my init **0x55f6a5c8ae70**
[DEBUG]: dlsym xyz from my init from global handle=0x7fce**952ce010**
来自其他功能
[DEBUG]: global handle in my api=**0x55f6a5c8ae70**
[DEBUG]: dlsym xyz from my api using global handle=0xffffffff**952ce010**
句柄是正确的但是返回的符号的指针是不一样的(有一部分...可能是相同的偏移量)