"Який" еквівалент для спільних бібліотек


10

Я шукаю утиліту, яка б поводилася так само, як which, але шукати спільні бібліотеки (* .so) у каталогах, визначених у $ LD_LIBRARY_PATH?

Відповіді:


5

Якщо у вас є виконуваний файл і ви хочете побачити, де він збирає бібліотеки, запустіть

ldd /path/to/executable

Це враховує бібліотеки на шляху пошуку за замовчуванням, а також бібліотеки у цьому виконуваному файлі, якщо вони є.

В Linux шляхи до системних бібліотек кешуються для ефективності. /sbin/ldconfig -pвідображає вміст кешу (він зберігається в /etc/ld.so.cache). Ось сценарій, який показує розташування бібліотек:

#!/bin/sh
if [ -n "$LD_LIBRARY_PATH" ]; then
  set -f
  IFS=:
  for d in $LD_LIBRARY_PATH; do
    if [ -e "$d/$1" ]; then echo "$1"; fi
  done
fi
/sbin/ldconfig -p |
awk -v needle="$1" '$1 == needle {sub(/.* => /, ""); print}'

5

Якщо ваші бібліотеки належним чином кешовані, ви можете знайти їх за допомогою:

ldconfig -p|grep "yourlibrary"

Якщо ви шукаєте бібліотеку, що постачається з вашим розповсюдженням, ви можете використовувати засоби розповсюдження для пошуку файлів у пакетах.

  • zipper wp "* / library.so" (SLES та OpenSuSE)
  • yum надає "* / library.so" (RedHat та його клони)

Це також виведе rpms, які не встановлені, але є частиною активних джерел установки.


3

Якщо ви шукаєте утиліту, яка буде працювати як прапор gcc' -lLIBNAME, який шукає файл з назвою, libLIBNAME.soви, ймовірно, можете скористатися невеликим сценарієм, який робить щось подібне:

#!/bin/sh
ldpath="${LD_LIBRARY_PATH:-$(</etc/ld.so.conf)}"
notfound=1
for libdir in ${ldpath//:/ }; do
        (test -f "$libdir/lib${1}.so" && echo "$_") && notfound=0
done
[ "$notfound" -eq 0 ]

1
Дякую за сценарій, але мені дуже цікаво, чи є для цього "стандартна" утиліта.
rahmu
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.