Найти каталог в общей папке поиска библиотеки
Я хочу, чтобы 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)
,