Я могу загрузить функции из динамической библиотеки со связью этого dl, но я не могу загрузить его, используя 'dlsym' в коде без связывания этого dl
Я использую gcc/g++ на fedora 116, и моя идея заключается в следующем:
c program -> load c++ dynamic library A -> load c++ dynamic library B
C++ динамическая библиотека B предоставляется сторонними разработчиками, и я не могу ее изменить.
Когда компилируется динамическая библиотека C++ A со связыванием динамической библиотеки C++ B, A может находить символы в B. Но когда я загружаю функции B в коде A (не связывая), используя 'dlsym', A говорит мне
/path/to/B.so: undefined symbol: some_func
=============================
использовать нм-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 ответ
Вы рассматривали искажение имени? Идентификаторы C++ обычно "искажены" для включения информации об их пространстве имен и аргументах (что исторически помогало компоновщикам различать перегруженные функции). Вы можете сделать функцию extern "C"
чтобы предотвратить искажение или найти его искаженное имя для использования с dlsym
(например, при использовании Linx nm
на объекте, или gcc -S -o /dev/tty ... | grep some_func
на источнике).