Дізнайтеся, чи перебуває бібліотека


15

Якщо припустити, що я хочу перевірити, чи встановлена ​​бібліотека та чи є вона корисною програмою. Я можу використовувати, ldconfig -p | grep mylibщоб дізнатися, чи встановлено він у системі. але що робити, якщо про бібліотеку відомо лише через налаштування LD_LIBRARY_PATH?

У цьому випадку програма може знайти бібліотеку, але ldconfigне буде. Як я можу перевірити, чи перебуває бібліотека у поєднаному контурі зв’язку?

Я додам, що я шукаю рішення, яке буде працювати, навіть якщо я насправді не маю під рукою програми (наприклад, програма ще не скомпільована), я просто хочу знати, що певна бібліотека існує в ld' s шляхів.


2
Ви можете ldd <binary>перевірити, чи перебувають усі пов'язані бібліотеки на шляху. Можливо, є більш елегантний спосіб.
Томас

@Thomas Я думаю, ви повинні відповісти на ваш коментар. lddслужить саме цій меті.
lgeorget

1
@Thomas - але що робити, якщо програма ще не скомпільована, і ця бібліотека потрібна для компіляції?
nbubis

@Igeorget - дивіться мою редагування / коментар
nbubis

@nbubis: коли вам потрібна бібліотека для компіляції, вам зазвичай потрібно використовувати LIBRARY_PATHзмінну середовища, яку шукає gccкомпілятор, наприклад. LIBRARY_PATHЗмінна середовища також має двокрапка відокремлено список каталогів.
Томас

Відповіді:


15

ldconfig може перелічити всі бібліотеки, до яких він має доступ. Ці бібліотеки також зберігаються в її кеші.

/sbin/ldconfig -v -Nсканує всі звичні шляхи до бібліотеки, перелічить усі наявні бібліотеки, не реконструюючи кеш (що неможливо, якщо ви не користувач root). Він НЕ враховує бібліотеки в LD_LIBRARY_PATH (протилежно тому, що ця публікація говорила перед редагуванням), але ви можете передати додаткові бібліотеки до командного рядка, скориставшись рядком нижче:

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)

ldconfig - це інструмент 1980-х, який був виданий у 1990-х. З цієї причини, ldconfigне є стерпним , оскільки це відноситься тільки до реалізації, які засновані на SunOS-4.0 на a.outоснові динамічного компоновщика з 1987
Шили

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

1
@nbubis ви завжди можете передавати бібліотеки в LD_LIBRARY_PATH до ldconfig. Як і /sbin/ldconfig -N -v $(sed 's/:/ /' <<< $LD_LIBRARY_PATH)не надто багато зайвого на мій смак.
lgeorget

@schily Дійсно? Наскільки я можу сказати, це дуже добре працює з бібліотеками ELF. І він досі використовується, ld.so покладається на кеш, створений ldconfig.
lgeorget

Люди Linux зламали старий вихідний код Sun linker для підтримки ELF. Нова реалізація ELF від Sun видалена ldconfigв угоді з AT&T, оскільки кешування лінкера було надто чутливим до помилок. ВС пізніше додав the tree stooges: moe, lariа в crleякості допоміжних програм для управління ELF.
шилі

2

Глобально замініть (простір) на :LD_LIBRARY_PATH

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)

2

Ви можете скласти просту програму тестування з gcc та зв’язати свою бібліотеку. Потім ви можете перевірити використані бібліотеки за допомогою ldd. Я використовую щось подібне:

echo "int main(){}" | gcc -x c++ -Wl,--no-as-needed -lmylib - && ldd a.out | grep mylib

-Wl,--no-as-needed не дає можливості лінкеру відкинути бібліотеку, оскільки символи з бібліотеки не використовуються.

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