Çalıştırılabilir dosyalar çalışma zamanında paylaşılan nesneleri nerede arar?


102

Bağlantı / derleme zamanında paylaşılan nesnelerin nasıl tanımlanacağını anlıyorum. Bununla birlikte, çalıştırılabilir dosyaların *.soyürütme zamanında paylaşılan nesneyi ( kitaplıkları) nasıl aradıklarını merak ediyorum .

Örneğin, uygulamam kütüphanede a.outtanımlanan işlevleri çağırıyor lib.so. Derledikten sonra, lib.soiçinde yeni bir dizine geçiyorum $HOME.

a.outOraya gidip onu aramayı nasıl söyleyebilirim ?

Yanıtlar:


102

Paylaşılan kitaplık NASIL katılan mekanizmaların çoğu açıklar ve dinamik yükleyici manuel daha ayrıntılı anlatır. Her unix varyantının kendi yolu vardır, ancak çoğu aynı çalıştırılabilir formatı ( ELF ) kullanır ve benzer dinamik bağlayıcılara sahiptir (Solaris'ten türetilmiştir). Aşağıda, Linux'a odaklanarak ortak davranışı özetleyeceğim; hikayenin tamamı için sistem kılavuzlarına bakın.

Kısaca, dinamik bir kütüphane ( .sodosya) ararken linker dener:

  • LD_LIBRARY_PATHortam değişkeninde listelenen dizinler ( DYLD_LIBRARY_PATHOSX'te);
  • çalıştırılabilir yolunda listelenen dizinler ;
  • (en azından Linux'taki) /etc/ld.so.confartı /libve /usr/lib.

Yol, çalıştırılabilir dosyada saklanır ( DT_RPATHveya DT_RUNPATHdinamik niteliktir). İle bu başlangıç mutlak yol veya yollar içerebilir $ORIGINyürütülebilir konuma ilişkin bir yol göstermek için (çalıştırılabilir örn ise /opt/myapp/binve rpath olup $ORIGIN/../lib:$ORIGIN/../pluginsdaha sonra dinamik bağlayıcı görüneceğini /opt/myapp/libve /opt/myapp/plugins). Rpath, çalıştırılabilir derlenirken, -rpathseçeneği ile belirlenir ld, ancak sonradan değiştirebilirsiniz chrpath.

Senaryoda Eğer uygulamanın geliştiricisi veya paketleyicisine iseniz, açıklamak ve bir yüklenecek için niyetinde …/bin, …/libyapısı, daha sonra bağlantı -rpath='$ORIGIN/../lib'. Sisteminize önceden oluşturulmuş bir ikili dosya yüklüyorsanız, kitaplığı arama yolundaki bir dizine yerleştirin ( /usr/local/libsistem yöneticisi iseniz, aksi takdirde eklediğiniz bir dizin $LD_LIBRARY_PATH) veya deneyin chrpath.


3
Bazı sistemlerde, /lib64ve /usr/lib6464 bitlik ikililer için kullanılır ve /libve /usr/lib32 bitlik ikililer için kullanılmaktadır.
Mark Lakata,

Neden bu doğru cevap ldconfig hakkında bir şey konuşmuyor ?
Olasılık Loves

1
@LovesProbability Bu soru, çalıştırılabilirlerin kütüphaneleri aradığı yerle ilgisi olduğu içindi ldconfig. ldconfigBir kitaplık yüklediğinizde yer alır.
Gilles

1
*.soKütüphaneler için "sistem arama yolu" ile aynı olmadığını unutmayın$PATH . Arama yolu @enzotib tarafından verilen cevaplarda olduğu gibidir. Aranacak yolları yazdırmak için çalıştırın ldconfig -v 2>/dev/null | grep -v ^$'\t'.
Andrew Bate,

benim için, ldconfig'i çalıştırmak için ihtiyacım vardı /sbin/ldconfigve Andrew
Bate'in

16

Linux'ta davranış ld(1)man sayfasında açıklanmıştır

       The linker uses the following search paths to locate required
       shared libraries:

       1.  Any directories specified by -rpath-link options.

       2.  Any directories specified by -rpath options.  The difference
           between -rpath and -rpath-link is that directories specified by
           -rpath options are included in the executable and used at
           runtime, whereas the -rpath-link option is only effective at
           link time. Searching -rpath in this way is only supported by
           native linkers and cross linkers which have been configured
           with the --with-sysroot option.

       3.  On an ELF system, for native linkers, if the -rpath and
           -rpath-link options were not used, search the contents of the
           environment variable "LD_RUN_PATH".

       4.  On SunOS, if the -rpath option was not used, search any
           directories specified using -L options.

       5.  For a native linker, the search the contents of the environment
           variable "LD_LIBRARY_PATH".

       6.  For a native ELF linker, the directories in "DT_RUNPATH" or
           "DT_RPATH" of a shared library are searched for shared
           libraries needed by it. The "DT_RPATH" entries are ignored if
           "DT_RUNPATH" entries exist.

       7.  The default directories, normally /lib and /usr/lib.

       8.  For a native linker on an ELF system, if the file
           /etc/ld.so.conf exists, the list of directories found in that
           file.

       If the required shared library is not found, the linker will issue
       a warning and continue with the link.

1
"Varsayılan dizinler, normalde / lib ve / usr / lib." -> Sistemimin normal olup olmadığını nasıl öğrenebilirim?
Thorsten Staerk

2
Soru çalışma zamanı ve bağlantı zamanı değil
Talespin_Kit

2

Buradaki cevabın oldukça eminim ldconfig.

ldconfig, komut satırında, /etc/ld.so.conf dosyasında ve / veya güvenilen dizinlerde (/ lib ve / usr / lib) belirtilen dizinlerde bulunan en son paylaşılan kütüphanelere gerekli bağlantıları ve önbelleği oluşturur. Önbellek, çalışma zamanı bağlayıcısı, ld.so veya ld-linux.so tarafından kullanılır. ldconfig, hangi sürümlerin bağlantılarının güncellenmesi gerektiğine karar verirken karşılaştığı kitaplıkların başlık ve dosya adlarını kontrol eder.

http://linux.die.net/man/8/ldconfig


0

Çalışan uygulamalar için dosya /proc/1234/mapstüm dinamik olarak bağlı kütüphaneleri içerir.

1234Çalıştırılabilir çalıştırıcının pid nerede .

Linux, Gilles tarafından yanıtta belirtildiği gibi LD_LIBRARY_PATH ve diğer değişkenleri takip eder.


4
İkinci cümlenizde Gilles cevaplarının yardımcı olduğunu onaylamanız çok hoş. Ancak ilk bölüm, dosyaların nerede olduğunu, ancak daha önceden bulunup bulunmadıklarını nereden anlayacağımızı açıklamaya hiç katkıda bulunmuyor. Sonuçta bu sadece bir yorum olmalı, bir cevap olmalıdır.
Anthon
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.