dlsym在另一个文件中,并在另一个文件中dlopen

时间:2018-05-12 23:27:56

标签: c shared-libraries dlopen dlsym

我有一个共享库,我在初始化例程中执行了(尝试了RTLD_LAZY和RTLD_NOW)。从此返回的句柄存储在一个全局void指针中(这在头文件abc.h中定义为extern)

与我的初始化例程在同一个库中的另一个API使用句柄来查找符号并调用API。但是从我看到的,作为第二个API的一部分从dlsym返回的指针与我在初始化API期间检查的指针不同。它看起来像下面的东西。

文件init.c

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;
}

文件init.h

extern void *global_handle;

文件myfile.c

#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**

句柄是正确的但是返回的符号的指针是不一样的(有一部分...可能是相同的偏移量)

0 个答案:

没有答案