После того, как я почти начал рвать свои волосы один за другим, я смог найти правильный способ загрузки моего .so во время выполнения.

Используя ‹dlfcn.h›, мы можем легко загрузить функции и символы из библиотеки в наш код c/cpp.

http://pubs.opengroup.org/onlinepubs/7908799/xsh/dlfcn.h.html

Их API довольно просты.

dlopen(char *, int)

Эта функция используется для чтения разделяемой библиотеки, точнее, она создает исполняемый объект из библиотеки.



Использование dlsym()/dlopen()
Я написал следующую программу: #include iostream #include dlfcn.h int main(int argc, char** argv) { typedef …stackoverflow.com



dlsym(void *, const char *)

Эта функция позволяет процессу получить адрес символа, определенного в объекте, доступном через dlopen(). Он будет искать именованный символ во всех объектах, которые загружаются автоматически в результате загрузки объекта, на который ссылается дескриптор.

Та часть, где dlsym ищет имя функции, очень важна. Если вы скомпилируете объект с помощью компилятора g++, вы обнаружите ошибку при загрузке символа. Ошибка будет чем-то вроде: -

Error while dynamically loading : Failed to load X. Error = /root/vmware/usr/openv/lib/Y.so: undefined symbol: X

Чтобы убедиться, что имя символа, указанного в вашем файле cpp, совпадает с именем в общей библиотеке, вы можете использовать следующую команду —

nm $SharedObject.so | grep $SymbolName

Воздержитесь от использования флага -c при использовании вышеуказанной команды, так как флаг покажет имя функции, которое видит компилятор c.

Компилятор C++ меняет имя функции, тогда как компилятор C не меняет имя функции. Вы можете попробовать сами, скомпилировав одну и ту же библиотеку разными компиляторами. Ниже приведен пример имени функции с именем «vmcGetDiskChangedInfoStrm ».

C++ compiler :-_Z25vmcGetDiskChangedInfoStrmPvilPKcS1_S1_S1_RSt18basic_stringstreamIcSt11char_traitsIcESaIcEEb
C compiler :- vmcGetDiskChangedInfoStrm

Вы можете обойти эту ошибку, используя extern «C» {void func()} в коде вашей библиотеки. Это скомпилирует определенную часть файла, используя gcc вместо g++.

dlclose(void *):-

Если объект, на который ссылается дескриптор, возвращенный из предыдущего вызова dlopen(), больше не нужен приложению, мы безопасно закрываем дескриптор с помощью dlclose.

С этим покончено!

Если вы можете загружать свои функции и динамически использовать общий объект во время выполнения, поздравляю с вашим достижением. Если у вас возникнут какие-либо проблемы, связанные с этим, прокомментируйте раздел ниже, и я постараюсь вам помочь. Надеюсь, этот пост помог вам понять принципы загрузки разделяемых библиотек во время выполнения. Спасибо за чтение !