Я могу загрузить функции из динамической библиотеки со связью этого dl, но я не могу загрузить его, используя 'dlsym' в коде без связывания этого dl - PullRequest
0 голосов
/ 02 марта 2012

Я использую gcc / g ++ на fedora 116, и моя идея заключается в следующем:

c program -> load c++ dynamic library A -> load c++ dynamic library B

Динамическая библиотека C ++ C предоставляется сторонней организацией, и я не могу ее изменить.

Когда компилируется динамическая библиотека C ++ A со связыванием динамической библиотеки C ++ B, A может находить символы в B. Но когда я загружаю функции B в коде A (не связывая), используя 'dlsym', A говорит мне

/path/to/B.so: undefined symbol: some_func

=============================

использовать nm -DC

0000000000014a80 T BinarySearch(int, int*, int)
0000000000007210 T CheckLicense()
0000000000009370 T GetEnd(stCha*, int&, int)
000000000000a970 T IC_Exit()
000000000000a740 T IC_Init(char const*)

ошибкаотчет:

/path/to/some.so undefined symbol: IC_Init

код в библиотеке A:

IC_API bool (* IC_Init)(const char *);
IC_Init = (IC_API bool (*)(const char *)) dlsym(dl_ic, "IC_Init");
if(IC_Init) {
    printf("function loaded");
}

в библиотеке A, он может загрузить библиотеку B, используя dlopen:

void *dl_ic = dlopen(ic_lib_path, RTLD_LAZY);

1 Ответ

3 голосов
/ 02 марта 2012

Вы рассматривали искажение имени? Идентификаторы C ++ обычно «искажены» для включения информации об их пространстве имен и аргументах (что исторически помогало компоновщикам различать перегруженные функции). Вы можете захотеть сделать функцию extern "C" для предотвращения искажения или найти ее искаженное имя для использования с dlsym (например, для Linx используйте nm для объекта или gcc -S -o /dev/tty ... | grep some_func для источника).

...