Найти каталог в пути поиска общего библиотеки

StackOverflow https://stackoverflow.com/questions/4213857

  •  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).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top