Как поиск .so файла для символов? - PullRequest
0 голосов
/ 28 августа 2018

У меня есть файл .so, в котором есть некоторые extern объявления функций. Определение этих функций в двоичном виде, к которому я отношусь связывание .so файла. Но при ссылке я получаю неопределенную ссылку ошибка.

Есть ли способ указать какой-либо путь в make-файле .so для поиска символов.

Я использовал objdump для перечисления символов в .so (объявление extern) и .o (фактическое определение - другой каталог), и я вижу, что один и тот же символ есть в обоих местах.

/homes/uakash/cmd/usr/lib64$ objdump -T libcpld-cmd.so.0 | grep Parent

:::::

0000000000000000      D  *UND*  0000000000000000              _Z29getParentCpldIFDOFromPreviousSt10shared_ptrIN3net74cpld14ParentCpldIFDOEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
::::

/homes/uakash/src/usr/sbin/l$ objdump -t cpld_cmd.o | grep Parent

::::
00000000000000d0 g     F .text  0000000000000600  _Z29getParentCpldIFDOFromPreviousSt10shared_ptrIN3net74cpld14ParentCpldIFDOEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
::::

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

У меня есть файл .so с некоторыми объявлениями внешних функций. Определение этих функций находится в двоичном файле, на который я ссылаюсь .so файл. Но при связывании я получаю неопределенную ошибку ссылки.

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

Читайте также Drepper's Как писать общие библиотеки paper.

0 голосов
/ 28 августа 2018

Похоже, вы неправильно понимаете, как работают общие библиотеки. .So файл содержит определение, как и .o файл. Один для динамического связывания, а другой для статического связывания. Вы должны использовать один или другой, но не оба.

Скажите, например, с учетом вашей общей разделяемой библиотеки libcpld-cmd.so, и вы хотите связать ее с вашим кодом, например, с источником main.c, затем:

gcc main.c -lcpld-cmd.so -o myprogram

Компоновщик обработает cpld-cmd.so для разрешения символов, но на самом деле не будет связывать в нем объектный код - это будет статическая ссылка.

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

Ссылка: http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html

Если, с другой стороны, вы хотите статически связать, вы бы связали cpld-cmd.o, а файл .so не играет роли и не требуется - весь код статически связан с myprogram.

gcc main.c cpld-cmd.o -o myprogram
...