Найти каталог в общей папке поиска библиотеки - PullRequest
2 голосов
/ 18 ноября 2010

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

Ответы [ 2 ]

5 голосов
/ 21 ноября 2010

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()

См. Также примечания в комментариях ниже ... вся тема скромно таит в себе различия от платформы к платформе.

1 голос
/ 20 ноября 2010

Я не уверен, что это возможно сделать и быть портативным.Поскольку этот вопрос касается 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).

...