Общая библиотека Linux зависит от символов в другой общей библиотеке, открытой dlopen с помощью RTLD_LOCAL - PullRequest
0 голосов
/ 30 мая 2019

У меня есть общая библиотека libmain.so, загруженная хост-программой с dlopen("libmain.so", RTLD_LOCAL), и при некоторых условиях libmain.so загрузит другую общую библиотеку libpatch.so, также с dlopen.Проблема в том, что libpatch.so зависит от символов внутри libmain.so , так как я могу решить эту проблему?

  1. Изменить RTLD_LOCAL на RTLD_GLOBAL невариант по причинам разрешения.

  2. Там вопрос, очень похожий на этот, решение этой проблемы состоит в том, чтобы сделать libpatch.so зависимостью libmain.so, поэтому он будет загружен при загрузке libmain.so, но мой libpatch.so должен быть загружен условно, libpatch.so может отсутствовать при подключении libmain.so.

РЕДАКТИРОВАТЬ: исходная проблема, которую я хочу решить:

Когда процесс запущен, мы можем обнаружить, что есть ошибка в функции SomeFunction внутри libmain.so, , но процесс не может бытьперезапускается и libmain.so не может быть перезагружен , поэтому мы должны предоставить libpatch.so с исправленной ошибкой функцией SomeFunction и отправить сигнал процессу, заставить его загрузить libpatch.so и использовать SomeFunction в libpatch.so вместо глючного в libmain.so.Однако SomeFunction зависит от глобальной переменной GlobalVar, и она могла измениться в libmain.so, поэтому мы хотим связать SomeFunction с ней внутри libmain.so, но libmain.so загружается с RTLD_LOCAL,На GlobalVar нельзя ссылаться, когда загружается libpatch.so.

1 Ответ

1 голос
/ 31 мая 2019

Скомпилируйте список символов из libmain.so, необходимый для libpatch.so.Создайте структуру данных, которая содержит адреса этих символов.Сборка libpatch.so не против libmain.so, а против этой структуры данных.Передайте его экземпляр в функцию инициализации libpatch.so.

...