Я могу загрузить функции из динамической библиотеки со связью этого 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 на источнике).

Другие вопросы по тегам