Kütüphanenin yolunda olup olmadığını öğrenin


15

Bir kütüphanenin bir program tarafından kurulmuş ve kullanılabilir olup olmadığını test etmek istediğimi varsayarsak. ldconfig -p | grep mylibSistemde yüklü olup olmadığını öğrenmek için kullanabilirim . ama kütüphane sadece ayar yoluyla biliniyorsa LD_LIBRARY_PATH?

Bu durumda, program kütüphaneyi bulabilir, ancak bulamaz ldconfig. Kütüphanenin birleştirilmiş bağlayıcı yolunda olup olmadığını nasıl kontrol edebilirim ?

Programın elinizde olmasa bile çalışacak bir çözüm aradığımı ekleyeceğim (örneğin program henüz derlenmemiştir), sadece belirli bir kütüphanenin ld' s yolları.


2
ldd <binary>Bağlı tüm kütüphanelerin yolda olup olmadığını kontrol etmek için kullanabilirsiniz . Belki daha zarif bir yol var.
Thomas

@Thomas Bence yorumuna cevap vermelisin. lddtam olarak bu amaca hizmet eder.
lgeorget

1
@Thomas - ama program henüz derlenmemişse ve bu kütüphane derleme için gerekliyse ne olur?
nbubis

@Igeorget - düzenleme / yorumuma bakın
nbubis

@nbubis: Derleme için kütüphaneye ihtiyaç duyduğunuzda, normalde LIBRARY_PATHörneğin gccderleyici tarafından aranan ortam değişkenini kullanmanız gerekir . LIBRARY_PATHÇevre değişkeni de, iki nokta üstüste ayrılmış listesi vardır.
Thomas

Yanıtlar:


15

ldconfig erişimi olan tüm kütüphaneleri listeleyebilir. Bu kütüphaneler de önbelleğinde saklanır.

/sbin/ldconfig -v -Ntüm olağan kütüphane yollarını tarar, önbelleği yeniden oluşturmadan mevcut tüm kütüphaneleri listeler (root olmayan bir kullanıcıysanız bu mümkün değildir). LD_LIBRARY_PATH içindeki kütüphaneleri (bu yayının düzenlemeden önce söylediklerine karşılık olarak) dikkate almaz, ancak aşağıdaki satırı kullanarak ek kütüphaneleri komut satırına iletebilirsiniz:

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

ldconfig, 1980'lerden 1990'larda bırakılmış bir araçtır. Bu nedenle, ldconfigsadece sunOS-4,0 dayanmaktadır uygulamalar için geçerli olan taşınabilir değildir a.out1987 dinamik bağlayıcı esaslı
Schily

Bu yalnızca LD_LIBRARY_PATH'taki kütüphanelerin listelenmesine nasıl yardımcı olur? Sanırım bunu ayrıştırmak için bir senaryo yazıp ldconfig ile okuyabilirdim, ama biraz fazla öldürmeye benziyor.
nbubis

1
@nbubis LD_LIBRARY_PATH içindeki kütüphaneleri her zaman ldconfig dosyasına aktarabilirsiniz. /sbin/ldconfig -N -v $(sed 's/:/ /' <<< $LD_LIBRARY_PATH)Benim zevkime göre aşırı bir fazlalık gibi değil.
lgeorget

@schily Gerçekten mi? Anlayabildiğim kadarıyla ELF kütüphaneleriyle oldukça iyi çalışıyor. Ve hala kullanılıyor, ld.so ldconfig tarafından oluşturulan önbelleğe güveniyor.
lgeorget

Linux halkı ELF'yi desteklemek için eski Sun linker kaynak kodunu hackledi. Sun'ın yeni ELF uygulaması ldconfig, bağlayıcı önbelleğe almanın hatalara karşı çok hassas olması nedeniyle AT&T ile yapılan bir anlaşmayla kaldırıldı . Güneş daha sonra eklenen the tree stooges: moe, larive crleELF yönetimi için yardımcı programlar gibi.
schily

2

Küresel olarak :LD_LIBRARY_PATH ile ikame (boşluk)

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

2

Basit bir test programını gcc ile derleyebilir ve kütüphanenizi bağlayabilirsiniz. Daha sonra kullanılmış kütüphaneleri ldd ile kontrol edebilirsiniz. Böyle bir şey kullanıyorum:

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

-Wl,--no-as-needed kütüphaneden hiçbir sembol kullanılmadığından, bağlayıcının kitaplığı atmasını önler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.