Найти каталог в пути поиска общего библиотеки
-
26-09-2019 - |
Вопрос
Я хочу DLOPEN () каждую общую библиотеку в определенном каталоге. Чтобы сделать это,
Какой самый чистый способ получить путь поиска библиотеки Linux. Или есть ли более быстрый способ найти определенный каталог в этом пути?
POSIX будет лучше.
Решение
POSIX не поддерживает механизм, чтобы узнать каталоги на пути поиска общего библиотеки (он не мандат LD_LIBRARY_PATH
, Например), поэтому любой раствор по своей природе некорвой платформе конкретно.
Linux представляет некоторые проблемы, потому что используемые значения могут быть основаны на содержании /etc/ld.so.conf
а также любое значение выполнения в LD_LIBRARY_PATH
переменная среды; Другие системы представляют сопоставимые проблемы. Расположение по умолчанию также варьируется в зависимости от системы - с /lib
а также /usr/lib
Будучи обычным для 32-битных машин Linux, но /lib64
а также /usr/lib64
Используется по крайней мере на одних 64-битных машинах. Однако другие платформы используют другие места для 64-битного программного обеспечения. Например, Solaris использует /lib/sparcv9
а также /usr/lib/sparcv9
, например (хотя документы упоминают /lib/64
а также /usr/lib/64
, они симлизы к sparcv9
каталоги). Солярис также имеет переменные среды LD_LIBRARY_PATH_64
а также LD_LIBRARY_PATH_32
. Отказ HP-UX и AIX традиционно используют другие переменные, чем LD_LIBRARY_PATH
-- SHLIB_PATH
а также LIBPATH
, МИРC - хотя я верю, что AIX теперь использует LD_LIBRARY_PATH
слишком. И, на Solaris инструмент для настройки общих библиотек - «CRLE» (настроить среду подключения среды выполнения) и аналогом /etc/ld.so.conf
это тоже /var/ld/ld.config
или /var/ld/64/ld.config
. Отказ Кроме того, конечно, расширения на общих библиотеках варьируются (.so
, .sl
, .dylib
, .bundle
, так далее).
Таким образом, ваше решение будет специфичным платформой. Вам нужно будет определиться с местоположениями по умолчанию, переменные среды для чтения и файл конфигурации для чтения и соответствующего расширения файла. Учитываями, то это в основном, Smop - простая материя программирования:
- Для каждого каталога имени любого из источников:
- Откройте соответствующий подсылок (
opendir()
)- Прочитайте каждое имя файла (
readdir()
) по очереди - Использовать
dlopen()
на пути соответствующих файлов. - Делайте любой анализ для вас.
- Использовать
dlclose()
- Прочитайте каждое имя файла (
- Использовать
closedir()
- Откройте соответствующий подсылок (
Смотрите также заметки в комментарии ниже ... Полная тема скромно чревата вариациями от платформы до платформы.
Другие советы
Я не уверен, что можно сделать так и быть портативным. Поскольку этот вопрос о Linux, портативность может не иметь первостепенного значения. Тогда я не понимаю ограничения POSIX. Не могли бы вы уточнить?
Вы, вероятно, придется либо реализовать функциональность поиска, подробную в man 8 ld.so
, который включает в себя сканирование /etc/ld.so.conf в дополнение к LD_LIBRARY_PATH
, или сделать /lib/ld.so
Делайте то, что вы хотите для вас и анализировать вывод. Не совсем красивая командная строка для этого может быть:
export LD_PRELOAD=THISLIBRARYSODOESNOTEXIST
strace -s 4096 /bin/true 2>&1 | sed -n 's/^open("\([^"]*\)\/THISLIBRARYSODOESNOTEXIST".*$/\1\/YOURSUBDIRHERE/gp'
unset LD_PRELOAD
Затем вы можете перечислять файлы с вызовами POSIX opendir(3)
а также readdir(3)
.