Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ под Linux
Войти
Регистрация
Восстановить пароль
 
 
jugu
213 / 138 / 26
Регистрация: 11.01.2019
Сообщений: 564
1

Распределение функций по библиотекам

09.11.2019, 11:12. Просмотров 372. Ответов 23

Всем привет!

Работаю сейчас в CodeBlocks 16 под Ubuntu 18.04. Частенько возникает задача определения библиотеки so.x.y, где находится определение функции. Пока что решаю ее тупым перебором. Выбираю библиотеку, имя которой более менее подходит, исходя из имени хэдера. Вывожу список экспортируемых этой библиотекой функций с помощью nm. Ищу нужное mangled name в списке. Однако вчера не смог найти библиотеку, где определена функция X509_free@@OPCUA_1.0.0. Соответственно, скомпоновать проект не удается пока.
Может есть какой-то иной, более "научный" способ решить эту задачу? Может есть ресурсы, где по имени функции можно найти библиотеку?

Заранее спасибо!
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2019, 11:12
Ответы с готовыми решениями:

23

DrOffset
10972 / 5845 / 1440
Регистрация: 30.01.2014
Сообщений: 9,402
09.11.2019, 13:03 2
Цитата Сообщение от jugu Посмотреть сообщение
X509_free
Это функция из библиотеки libcrypto.so (в составе OpenSSL).
1
jugu
213 / 138 / 26
Регистрация: 11.01.2019
Сообщений: 564
09.11.2019, 14:32  [ТС] 3
Да, это я уже понял, Единственная ремарка, что so это скрипт компоновщика, а не библиотека, насколько я знаю.
Но тут больше вопрос общего плана. Как быстро определить, где именно содержится реализация функции? Потому как копаться так с каждой функцией... это тот еще гемор ((
0
gng
906 / 624 / 197
Регистрация: 08.09.2013
Сообщений: 1,688
09.11.2019, 16:14 4
Цитата Сообщение от jugu Посмотреть сообщение
Да, это я уже понял, Единственная ремарка, что so это скрипт компоновщика, а не библиотека, насколько я знаю.
Ничего не понял. libcrypto.so - это разделяемая библиотека или символьная ссылка на нужную версию этой библиотеки
Bash
1
2
3
4
5
$ ls -l /usr/lib/i386-linux-gnu/libcrypto.*
-rw-r--r-- 1 root root 4015990 Sep 27 22:46 /usr/lib/i386-linux-gnu/libcrypto.a
lrwxrwxrwx 1 root root      16 Sep 27 22:46 /usr/lib/i386-linux-gnu/libcrypto.so -> libcrypto.so.1.1
-rw-r--r-- 1 root root 2107652 Jun 26 21:25 /usr/lib/i386-linux-gnu/libcrypto.so.1.0.2
-rw-r--r-- 1 root root 2536404 Sep 27 22:46 /usr/lib/i386-linux-gnu/libcrypto.so.1.1
Цитата Сообщение от jugu Посмотреть сообщение
Как быстро определить, где именно содержится реализация функции?
Обычно для этого используют утилиту pkg-config. Чаще всего, в качестве параметра командной строки компилятора.
Bash
1
2
$ pkg-config --libs openssl
-lssl -lcrypto
1
09.11.2019, 16:14
jugu
213 / 138 / 26
Регистрация: 11.01.2019
Сообщений: 564
09.11.2019, 16:54  [ТС] 5
Цитата Сообщение от gng Посмотреть сообщение
libcrypto.so - это разделяемая библиотека или символьная ссылка на нужную версию этой библиотеки
А почему nm ее не распознает тогда как библиотеку?

Цитата Сообщение от gng Посмотреть сообщение
Обычно для этого используют утилиту pkg-config. Чаще всего, в качестве параметра командной строки компилятора.
Это не отвечает на мой вопрос. Еще раз его повторю: как найти библиотеку, где определена конкретная функция?

Добавлено через 11 минут
Еще раз подробнее опишу ситуацию.
Я делаю OPCUA-клиент под Убунту в CodeBlocks. При сборке вылезла unresolved reference на функцию X509_free. Путем загугливания я нашел, в какой библиотеке находится ее реализация. Потом вылезла unresolved reference на функцию sk_free. Тоже нашел библиотеку через доктора Гугла. Но это же ведь не дело так искать каждую функцию! Отсюда и вопрос. Может есть где ресурсы с описанием содержимого библиотек? Или какой-то хитрый способ...
0
DrOffset
10972 / 5845 / 1440
Регистрация: 30.01.2014
Сообщений: 9,402
09.11.2019, 18:01 6
Цитата Сообщение от jugu Посмотреть сообщение
Отсюда и вопрос. Может есть где ресурсы с описанием содержимого библиотек? Или какой-то хитрый способ...
Обычно перед использованием библиотеки программист изучает ее документацию.
И вот там почти всегда присутствует описание как правильно ее линковать.

Какого-то централизованного ресурса нет.

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

Поэтому только вдумчивое изучение всей документации, относящейся к библиотекам, которые вы планируете использовать в проекте.
0
DrOffset
10972 / 5845 / 1440
Регистрация: 30.01.2014
Сообщений: 9,402
09.11.2019, 18:07 7
Цитата Сообщение от jugu Посмотреть сообщение
А почему nm ее не распознает тогда как библиотеку?
У меня все распознает
Распределение функций по библиотекам
1
jugu
213 / 138 / 26
Регистрация: 11.01.2019
Сообщений: 564
09.11.2019, 19:17  [ТС] 8
Цитата Сообщение от DrOffset Посмотреть сообщение
У меня все распознает
Подозреваю, что дело в ключике -AD

Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Обычно перед использованием библиотеки программист изучает ее документацию.
И вот там почти всегда присутствует описание как правильно ее линковать.
Увы, это имеет место в идеальном мире. В реальности всегда вылезает какая-то unresolved external, и не знаешь, где ее искать.
В моем случае проект в Виртуал Боксе под виндой отлично скомпоновался, а в CodeBlocks под Убунтой начались проблемы...
0
DrOffset
10972 / 5845 / 1440
Регистрация: 30.01.2014
Сообщений: 9,402
09.11.2019, 19:39 9
Цитата Сообщение от jugu Посмотреть сообщение
Увы, это имеет место в идеальном мире. В реальности всегда вылезает какая-то unresolved external, и не знаешь, где ее искать.
Вы должны лучше понимать что у вас происходит в проекте. Если у вас под виндой по умолчанию линкуется какая-то библиотека, которая содержит нужные функции, то вы должны знать об этом. Или о том, что версии библиотек у вас разные на разных системах, и что в одной версии эти функции были, а в другой их нет (или они не требовались для данного примера, потому что макроконфигурация отличается). Или о том, что у вас используется другая библиотека, которая через себя подтянула требуемую и линковка разрешилась. И многие другие подобные нюансы.
Если же вы ну никак не можете определить причину, то уже можно поискать через nm или в google.

Единого репозитория, который бы в соответствии с версиями и кросс-зависимостями выдавал вам информацию по доступным функциям - нет.

Цитата Сообщение от jugu Посмотреть сообщение
Подозреваю, что дело в ключике -AD
Дело в ключике -D. Он просто выводит динамические символы.
0
gng
906 / 624 / 197
Регистрация: 08.09.2013
Сообщений: 1,688
09.11.2019, 20:42 10
Цитата Сообщение от jugu Посмотреть сообщение
Это не отвечает на мой вопрос. Еще раз его повторю: как найти библиотеку, где определена конкретная функция?
Вы имеете в виду, что pkg-config НЕ ВСЕГДА подключает нужную библиотеку, если она установлена в системе стандартным образом? Соглашусь - не всегда. Но в вашем случае (openssl, X509_free. sk_free) достаточно было, учитывая, что проект использует openssl дописать к парамертам компилятора/линкера pkg-config --libs openssl.

Добавлено через 8 минут
PS. Как раз в Венде нужно вручную скачивать и располагать по каталогам библиотеки, разбираться с зоопарком этих библиотек и их версий, прописывать их расположение в параметры системы сборки и т.д.
В Линуксе это уже сделано за вас. Достаточно указать системе сборки через pkg-config, что вы используете openssl. Прще этого - только система модулей, которую в C++ вот уже лет 10 планируют ввети, но воз и ныне там.
0
jugu
213 / 138 / 26
Регистрация: 11.01.2019
Сообщений: 564
09.11.2019, 22:03  [ТС] 11
Цитата Сообщение от DrOffset Посмотреть сообщение
Единого репозитория, который бы в соответствии с версиями и кросс-зависимостями выдавал вам информацию по доступным функциям - нет.
Эх, жаль...

Цитата Сообщение от gng Посмотреть сообщение
Как раз в Венде нужно вручную скачивать и располагать по каталогам библиотеки, разбираться с зоопарком этих библиотек и их версий, прописывать их расположение в параметры системы сборки и т.д.
Увы, приходится делать это и в Линуксе. По крайней мере, в настройках компилера CodeBlocks мне не удалось все настроить, чтоб линковка шла сразу без проблем.
0
gng
906 / 624 / 197
Регистрация: 08.09.2013
Сообщений: 1,688
09.11.2019, 22:36 12
Цитата Сообщение от jugu Посмотреть сообщение
По крайней мере, в настройках компилера CodeBlocks мне не удалось все настроить, чтоб линковка шла сразу без проблем.
Если:
1) библиотека openssl установлена из пакетов.
2) установлен pkg-config
то достаточно в опции линкера добавить
'pkg-config --libs openssl'
(одинарные ковычки обязательны)

Добавлено через 21 минуту
PS.
Цитата Сообщение от gng Посмотреть сообщение
(одинарные ковычки обязательны)
Прошу прощения за неточность - обратные одинарные ковычки ``
1
jugu
213 / 138 / 26
Регистрация: 11.01.2019
Сообщений: 564
09.11.2019, 22:39  [ТС] 13
Дело не в openssl. Меня интересовала только возможность быстрого поиска библиотек, содержащих нужную функцию.
0
peter_irich
74 / 68 / 21
Регистрация: 18.10.2017
Сообщений: 628
10.11.2019, 11:43 14
В я для этого использую небольшой скрипт, он у меня в ~/bin, а запускать его надо в каталоге,
где предположительно находится библиотека с искомой функцией с именем этой функции, как параметром.
Например, для поиска библиотеки с функцией sin() надо в /lib/x86_64-linux-gnu ввести команду
Код
fndlib_b_s sin
или
Код
fnd_lib_s_i sin
и в $HOME появится некий файл. Вот fndlib_b_s
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
 
rm -f ~/lib_s-lst
for bn in [ `/bin/ls *.so*` ]
do
if [ ! -h $bn ] && [ -f $bn ] ; then
echo $bn
#readelf -s $bn > ~/lst 2>&1
nm -C -D $bn > ~/lst    2>&1
#objdump -t $fn > lst
#fn=`grep -e "[[:print:]]" < ~/lst| grep -cE " ${1}"`
fn=`grep -e "[[:print:]]" < ~/lst| grep -cE "${1}"`
if [ $fn -gt 0 ] ; then
echo $bn $1 $fn
echo $bn $1 $fn >> ~/lib_s-lst 2>&1
#exit
fi
fi
done
rm -f ~/lst
вот fndlib_b_s_i, я только что добавил её

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
 
rm -f ~/lib_s-lsti
for bn in [ `/bin/ls *.so*` ]
do
if [ ! -h $bn ] && [ -f $bn ] ; then
echo $bn
#readelf -s $bn > ~/lst 2>&1
nm -C -D $bn > ~/lst    2>&1
grep " i "  ~/lst > ~/lsti
#objdump -t $fn > lst
#fn=`grep -e "[[:print:]]" < ~/lst| grep -cE " ${1}"`
fn=`grep -e "[[:print:]]" < ~/lsti| grep -cE "${1}"`
if [ $fn -gt 0 ] ; then
echo $bn $1 $fn
echo $bn $1 $fn >> ~/lib_s-lsti 2>&1
#exit
fi
fi
done
rm -f ~/lst ~/lsti
1
jugu
213 / 138 / 26
Регистрация: 11.01.2019
Сообщений: 564
10.11.2019, 13:11  [ТС] 15
Вот это уже интересненько.... Надо попробовать.
0
DrOffset
10972 / 5845 / 1440
Регистрация: 30.01.2014
Сообщений: 9,402
10.11.2019, 16:19 16
Цитата Сообщение от jugu Посмотреть сообщение
Вот это уже интересненько....
...
Цитата Сообщение от DrOffset Посмотреть сообщение
Как вариант, можно написать скрипт, который пройдет по всем разделяемым библиотекам в системе и поищет в них требуемую функцию.
Однако это не спасет от ситуации, когда библиотеки физически нет в системе и ее надо поставить.
0
jugu
213 / 138 / 26
Регистрация: 11.01.2019
Сообщений: 564
10.11.2019, 16:36  [ТС] 17
Вот жаль, что компоновщики не сообщают, в какой библиотеке эта функция расположена. Понимаю, что библиотек много всяких, но хотя бы для стандартных было бы неплохо...
А так, по-сути, процесс компоновки не изменился со времен MS-DOS, когда нам все приходилось прописывать ручками. Но это из риторического...
0
peter_irich
74 / 68 / 21
Регистрация: 18.10.2017
Сообщений: 628
10.11.2019, 17:30 18
jugu, в справке на функцию может быть указано, какую библиотеку надо линковать,
например, в "man sin" сказано "-lm", т.е. искать и не надо.
0
jugu
213 / 138 / 26
Регистрация: 11.01.2019
Сообщений: 564
10.11.2019, 17:46  [ТС] 19
Цитата Сообщение от peter_irich Посмотреть сообщение
jugu, в справке на функцию может быть указано, какую библиотеку надо линковать,
Да, бывает такое, но в меньшинстве случаев.
0
gng
906 / 624 / 197
Регистрация: 08.09.2013
Сообщений: 1,688
10.11.2019, 21:19 20
Цитата Сообщение от jugu Посмотреть сообщение
Вот жаль, что компоновщики не сообщают, в какой библиотеке эта функция расположена.
Откуда ему знать? Это не его задача.
Алгоритм примерно такой (на примере той же X509_free).
1) В man X509_free читаем:
#include <openssl/x509.h>
Из этого понятно, что функция относится к одной из либ проекта openssl
2) Проверяем, есть ли информация о openssl в локальной базе pkg-config
Bash
1
2
3
$ pkg-config --list-all | grep ssl
libssl                         OpenSSL-libssl - Secure Sockets Layer and cryptography libraries
openssl                        OpenSSL - Secure Sockets Layer and cryptography libraries and tools
Имя openssl зарегистрировано в системе.
Смотрим опции копоновщика для либ
Bash
1
2
$ pkg-config --libs openssl
-lssl -lcrypto
Пути для заголовков
Bash
1
2
pkg-config --cflags openssl
<пусто>
Пусто, значит указанный в мане заголовок ищется по стандартным путям и не требует доп. опций компилятору.
0
10.11.2019, 21:19
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2019, 21:19

Какими библиотекам пользуетесь?
Какие родные и нестандартные библиотеки вы используете в программировании с использованием C#?

Справочник по стандартным библиотекам c++
Доброго времени суток! Подскажите, пожалуйста, где можно найти максимально подробное описание...

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.