У меня есть общая библиотека, которую я добавляю (пробовал и RTLD_LAZY, и RTLD_NOW) во время процедуры инициализации.Возвращенный из этого дескриптор сохраняется в глобальном указателе void (это определяется как extern в заголовочном файле abc.h)
Другой 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 содержит символа.Я проверил это, используя
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**
дескриптор верен, но указатель на возвращаемый символ не совпадает (есть часть этого ... возможно, смещение, которое является тем же)