Почему плагин Dynami c библиотека не может найти символ в приложении? - PullRequest
3 голосов
/ 07 января 2020

У меня есть приложение, которое скомпилировало в него несколько библиотек через ссылку c.

И это приложение будет загружать плагин через dlopen при запуске.

Но оно Кажется, что плагин не может разрешить символ в приложении, который я могу найти через «nm».

Так что я могу сделать? Перекомпилировать библиотеки в общий режим и связать их с плагином?

Ответы [ 2 ]

3 голосов
/ 08 января 2020

Обычное предложение добавить -rdynamic на практике слишком тяжело, поскольку компоновщик экспортирует все функции в исполняемый файл. Это замедлит запуск программы (из-за увеличенного времени на обработку перемещения ) и, что более важно, в конечном итоге сделает интерфейс между вашим приложением и плагинами слишком широким, поэтому его будет сложно поддерживать в будущем (например, вы не сможет удалить любую функцию из вашего приложения, опасаясь, что она может быть использована каким-либо неизвестным внешним плагином). Обычно вы должны стремиться предоставить минимальный и четко определенный API для авторов плагинов.

Поэтому я рекомендую при экспорте ссылаться на явный файл экспорта через -Wl,--dynamic-list (см. Пример использования в Clang sources ).

3 голосов
/ 07 января 2020

При связывании приложения необходимо использовать флаг g cc -rdynamic, который экспортирует символы приложения для динамического c связывания с общими библиотеками.

Из g cc документация:

Передайте флаг -export-dynamici c компоновщику ELF для целей, которые его поддерживают. Это указывает компоновщику добавлять все символы, не только используемые, в таблицу символов Dynami c. Эта опция необходима для некоторых применений dlopen или для получения обратных трассировок внутри программы.

Это должно устранить вашу проблему.

...