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.


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)

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)

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.