dlsym в другом файле и dlopen в другом файле - PullRequest
0 голосов
/ 13 мая 2018

У меня есть общая библиотека, которую я добавляю (пробовал и 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**

дескриптор верен, но указатель на возвращаемый символ не совпадает (есть часть этого ... возможно, смещение, которое является тем же)

...