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

Я хочу, чтобы dlopen() каждая общая библиотека в определенном каталоге. Чтобы сделать это,
Какой самый чистый способ получить путь поиска библиотеки Linux. Или есть более быстрый способ найти конкретный каталог по этому пути?
Posix будет лучше.

2 ответа

Решение

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 каталоги). Solaris также имеет переменные среды LD_LIBRARY_PATH_64 а также LD_LIBRARY_PATH_32, HP-UX и AIX традиционно используют другие переменные, чем LD_LIBRARY_PATH - SHLIB_PATH а также LIBPATH, IIRC - хотя я считаю, что 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),

Другие вопросы по тегам