Судя по мануалу функция "dlopen" позволяет подключить so, передав туда наименование библиотеки. Далее оно производит поиск и подключает эту самую библиотеку.
Однако прошутдировав мануал я не нашёл ни одной функции, которая бы возвращала реальное физическое расположение библиотеки по этому самому имени. Что-то вроде dlfind("some.so"); // => /usr/lib/some.so.3
Единственный вариант, который придумался - это запускать процесс "strings -n5 /etc/ld.so.cache", затем нехитрыми манипуляциями получать список всех возможных директорий и там находить нужную so.
Однако проблемы такого подхода:
1) Создание дочернего процесса, что мне не особо нравится
2) Файл "ld.so.cache" может не существовать физически (ну например его кто-то грохнул), а dlopen при этом замечательно продолжает работать.
Тыкните в мануал плиз, как получить полный путь к *.so библиотеке по её имени? Ну или как получить список всех директорий, где могут лежать эти либы: Тогда простым перебором можно найти полный путь руками.
P.S. Придумался ещё вариант ручного считывания /etc/ld.so.conf. Кажется, пока что это самый адекватный вариант.
dladdr выдает структуру, в которой есть полный путь к .so
typedef struct {
const char *dli_fname; /* Pathname of shared object that
contains address */
void *dli_fbase; /* Base address at which shared
object is loaded */
const char *dli_sname; /* Name of symbol whose definition
overlaps addr */
void *dli_saddr; /* Exact address of symbol named
in dli_sname */
} Dl_info;
Только насколько я понял dladdr принимает в качестве первого аргумента функцию, информацию о которой следует получить. Проблема в том, что никаких функций в наличии нет.
Бобби Шифер, парсить elf для того, чтобы получить функцию, по которой можно получить путь к либе, где она определена? Звучит как вырезание гланд через задницу) Мне всего лишь pathname к библиотеке по её имени нужно получить
Бобби Шифер, пишу АПИ для кроссплатформенного резолва библиотек: Для того, чтобы определить и выбрать подходящую в зависимости от платформы/архитектуры/ос. Так что получение пути является частью функции проверки существования lib.available("name.so").
Кирилл Несмеянов, чем вредно? Факт загружаемости библиотеки говорит о том, что она работоспособна (архитектура верная и есть в наличии все зависимости). Факт наличия файла не говорит ни о чем.
Т.е. предлагается произвести поиск по всей файловой системе? Представляете, вызываете вы функцию `Library.exists("libGl.so")`, а оно повисает на час и за всё это время ищет по всем 5 терабайтам нужную библиотеку.