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.