C dlsym在不同的文件中,dlopen在不同的文件中

C dlsym在不同的文件中,dlopen在不同的文件中,c,shared-libraries,dlopen,dlsym,C,Shared Libraries,Dlopen,Dlsym,我有一个共享库,我在初始化例程中打开了它(尝试了RTLD_LAZY和RTLD_NOW)。由此返回的句柄存储在全局void指针中(在头文件abc.h中定义为extern) 与我的初始化例程位于同一库中的另一个API使用句柄查找符号并调用该API。但是从我看到的情况来看,作为dlsym第二个API的一部分返回的指针与我在初始化API期间检查的指针不同。它看起来像下面这样 文件init.c 文件myfile.c 任何可能导致此问题的线索都会非常有用吗 [DEBUG]: global handle fr

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

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

文件init.c 文件myfile.c 任何可能导致此问题的线索都会非常有用吗

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

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

如果没有代码复制它,我们不可能猜测问题的性质,即a。在我看来,您的printf格式不适合参数类型。或者您未能声明
dlsym
,并且返回类型默认为
int
。或者其他一些类型转换问题,如果您使用
-Wall
编译并通读警告消息,就会发现这些问题。@JohnBollinger我试图添加我试图描述为代码的内容。你能告诉我这是否有帮助吗?你粘贴的代码中有很多拼写错误,这会阻止它被编译而没有错误,所以我猜这不是你真正的代码。如果您能够修复这些错误并验证您是否看到相同的问题,这将非常有用;请参阅有关创建一个应用程序的SO帮助。然而,我看到的是,您的api函数被声明为接受指针参数,但您使用一个简单的整数调用它。如果它真的需要一个指针,那肯定会导致segfault。这是真的。那只是个打字错误。但是,您是否看到与使用slopen和dlsym相关的任何其他问题,正如我在上面试图解释的那样,可能会导致该问题?为什么dlsym返回的值与上面显示的不同。你能给我举一个例子或者任何可能尝试过的用法吗?我试着四处看看,发现没有这种用法
#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;
}
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**