Cari tahu apakah perpustakaan ada di jalurnya

14

Dengan asumsi saya ingin menguji apakah perpustakaan diinstal dan dapat digunakan oleh suatu program. Saya dapat menggunakan ldconfig -p | grep mylibuntuk mencari tahu apakah itu diinstal pada sistem. tetapi bagaimana jika perpustakaan hanya diketahui melalui pengaturan LD_LIBRARY_PATH?

Jika demikian, program mungkin dapat menemukan perpustakaan, tetapi ldconfigtidak akan. Bagaimana saya bisa memeriksa apakah perpustakaan ada di jalur tautan gabungan ?

Saya akan menambahkan bahwa saya sedang mencari solusi yang akan berfungsi bahkan jika saya tidak benar-benar memiliki program yang ada (misalnya program belum dikompilasi), saya hanya ingin tahu bahwa ada perpustakaan tertentu di ld' jalan.

nbubis
sumber
2
Anda bisa menggunakan ldd <binary>untuk memeriksa apakah semua perpustakaan yang terhubung ada di jalur. Mungkin ada cara yang lebih elegan.
Thomas
@ Thomas Saya pikir Anda harus membuat jawaban atas komentar Anda. lddmelayani tujuan ini dengan tepat.
lgeorget
1
@ Thomas - tetapi bagaimana jika saya program belum dikompilasi, dan perpustakaan itu diperlukan untuk kompilasi?
nbubis
@Igeorget - lihat edit / komentar saya
nbubis
@nbubis: ketika Anda membutuhkan pustaka untuk kompilasi, Anda biasanya harus menggunakan LIBRARY_PATHvariabel lingkungan yang dicari misalnya oleh gcckompiler. The LIBRARY_PATHvariabel lingkungan juga memiliki daftar usus dipisahkan dari direktori.
Thomas

Jawaban:

14

ldconfig dapat membuat daftar semua perpustakaan yang memiliki akses. Perpustakaan ini juga disimpan dalam cache-nya.

/sbin/ldconfig -v -Nakan merayapi semua jalur pustaka yang biasa, daftar semua pustaka yang tersedia, tanpa merekonstruksi cache (yang tidak mungkin jika Anda pengguna non-root). Ini TIDAK memperhitungkan perpustakaan akun di LD_LIBRARY_PATH (bertentangan dengan apa yang dikatakan oleh posting ini sebelum diedit) tetapi Anda dapat meneruskan perpustakaan tambahan ke baris perintah dengan menggunakan baris di bawah ini:

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)
lororget
sumber
ldconfig adalah alat dari tahun 1980-an yang menyerah pada tahun 1990-an. Karena alasan ini, ldconfigtidak portabel karena hanya berlaku untuk implementasi yang didasarkan pada a.outpenghubung dinamis berbasis SunOS-4.0 dari tahun 1987.
schily
Bagaimana hal itu membantu membuat daftar lib yang hanya ada di LD_LIBRARY_PATH? Saya kira saya bisa menulis skrip untuk mem-parsing itu dan kemudian membacanya melalui ldconfig, tapi sepertinya agak over kill.
nbubis
1
@nbubis Anda selalu dapat meneruskan perpustakaan di LD_LIBRARY_PATH ke ldconfig. Seperti /sbin/ldconfig -N -v $(sed 's/:/ /' <<< $LD_LIBRARY_PATH)tidak terlalu banyak membunuh terlalu banyak untuk seleraku.
lgeorget
@Sungguh Benarkah? Ini berfungsi cukup baik dengan perpustakaan ELF sejauh yang saya tahu. Dan ini masih digunakan, ld.so mengandalkan cache yang dibangun oleh ldconfig.
lororget
Orang-orang Linux meretas kode sumber Sun linker lama untuk mendukung ELF. Implementasi ELF baru dari Sun dihapus ldconfigdalam perjanjian dengan AT&T karena caching linker terlalu sensitif terhadap kesalahan. Sun kemudian menambahkan the tree stooges: moe, laridan crlesebagai program pembantu untuk manajemen ELF.
schily
2

Pengganti global (spasi) :dengan dengan LD_LIBRARY_PATH

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

Anda dapat menyusun program pengujian sederhana dengan gcc dan menautkan perpustakaan Anda. Kemudian Anda dapat memeriksa pustaka yang digunakan dengan ldd. Saya menggunakan sesuatu seperti ini:

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

-Wl,--no-as-needed mencegah tautan menghapus perpustakaan, karena tidak ada simbol dari perpustakaan yang digunakan.

guini
sumber