Динамическая загрузка: неопределенный символ в общей статической библиотеке - PullRequest
2 голосов
/ 26 мая 2011

У меня есть исполняемый файл, который загружает .so плагинов.

Исполняемый файл связан с -rdynamic, поэтому возможен обратный вызов символа.

У меня есть статическая библиотека, которая включена в исполняемый файл. У этого есть функция, названная BLAH_hello() в .a

Статическая библиотека не используется в исполняемом файле. т.е. в исполняемом коде нет вызовов BLAH_hello().

Однако у .so есть вызовы на BLAH_hello().

Когда я dlopen() .so, он жалуется на неопределенный символ BLAH_hello()

Если , я включаю фиктивный вызов BLAH_hello() в исполняемый код, например BLAH_hello(NULL);. Символ включается в исполняемый файл, и когда загружается .so, он находит символ.

Я уверен, что мог бы также связать .so с .a, но несколько динамически загруженных .so используют вызов BLAH_hello, поэтому имеет смысл иметь его в исполняемом файле. Меня также беспокоит конфликт символов, если я связываю библиотеку с каждым .so.

Так что мне интересно, как получить символы .a в исполняемый файл, даже если они на самом деле не используются в исполняемом файле?

Ответы [ 3 ]

4 голосов
/ 24 июля 2011

Когда я делаю dlopen () .so, он жалуется на неопределенный символ для BLAH_hello ()

Если я включаю фиктивный вызов BLAH_hello () в исполняемый код, например BLAH_hello (NULL) ;. Символ включается в исполняемый файл, и когда загружается .so, он находит символ.

Это совершенно нормально и ожидаемо. Просто как работают компоновщики с архивными библиотеками .

Если необходимо включить BLAH_hello в основной исполняемый файл, добавьте -Wl,-u,BLAH_hello в строку ссылки на исполняемый файл.

1 голос
/ 27 мая 2011

@ nbt:

Связь .so с .a очевидна и правильна делаем.

Это не должно генерировать конфликты символов при загрузке .so в исполняемый файл.

0 голосов
/ 28 июня 2014

Как упоминалось выше, компоновщик удаляет файлы .o без ссылочных символов. Это проблема, когда исполняемый файл должен dlopen () внешние разделяемые библиотеки. В этом случае при компоновке исполняемого файла могут использоваться параметры компоновщика «--whole-archive» и «--no-whole-archive». Все .a библиотеки между этими опциями будут иметь все символы. Это увеличивает размер исполняемого файла, но устраняет необходимость ссылки на статические библиотеки исполняемого файла.

...