Linux'ta Paylaşılan Kitaplıkları Anlamak


Programlamada kütüphane, bir programda yeniden kullanılabilen, önceden derlenmiş kod parçalarının bir çeşididir. Kütüphaneler programcıların hayatını kolaylaştırır; programlarında kullanabilecekleri yeniden kullanılabilir işlevler, rutinler, sınıflar, veri yapıları vb. (başka bir programcı tarafından yazılmıştır) sağlarlar.

Örneğin, matematik işlemlerini gerçekleştirmesi gereken bir uygulama geliştiriyorsanız, bunun için yeni bir matematik fonksiyonu oluşturmanıza gerek yoktur, o programlama dili için kütüphanelerde mevcut fonksiyonları kullanabilirsiniz.

Linux'taki kitaplık örnekleri arasında libc (standart C kitaplığı) veya Glibc (standart C kitaplığının GNU sürümü), libcurl (çoklu protokol dosyası) yer alır. aktarım kitaplığı), libcrypt (C'de şifreleme, karma oluşturma ve kodlama için kullanılan kitaplık) ve çok daha fazlası.

Linux iki sınıf kütüphaneyi destekler:

  • Statik kitaplıklar – derleme zamanında bir programa statik olarak bağlanır.
  • Dinamik veya paylaşılan kitaplıklar – bir program başlatıldığında ve belleğe yüklendiğinde yüklenir ve bağlama çalışma zamanında gerçekleşir.

Dinamik veya paylaşılan kitaplıklar ayrıca şu kategorilere ayrılabilir:

  • Dinamik olarak bağlantılı kitaplıklar – burada bir program paylaşılan kitaplığa bağlanır ve yürütme sonrasında çekirdek kitaplığı yükler (bellekte olmaması durumunda).
  • Dinamik olarak yüklenen kitaplıklar – program, kitaplıkla işlevleri çağırarak tam kontrolü ele alır.

Paylaşılan Kitaplık Adlandırma Kuralları

Paylaşılan kütüphaneler iki şekilde adlandırılır: kütüphane adı (a.k.a soname) ve “dosya adı” (kütüphane kodunu saklayan dosyanın mutlak yolu).

Örneğin, libc için soname libc.so.6'dır: burada lib önektir, c açıklayıcı bir addır, dolayısıyla paylaşılan nesne anlamına gelir ve 6 sürümdür. Dosya adı da şudur: /lib64/libc.so.6. Son adın aslında dosya adına sembolik bir bağlantı olduğunu unutmayın.

Linux'ta Paylaşılan Kitaplıkları Bulma

Paylaşılan kütüphaneler ld.so (veya ld.so.x) ve ld-linux.so (veya ld-) tarafından yüklenir. linux.so.x) programlarıdır; burada x sürümdür. Linux'ta /lib/ld-linux.so.x, bir program tarafından kullanılan tüm paylaşılan kitaplıkları arar ve yükler.

Bir program, kitaplık adını veya dosya adını kullanarak bir kitaplığı çağırabilir ve kitaplık yolu, kitaplıkların dosya sisteminde bulunabileceği dizinleri depolar. Varsayılan olarak kitaplıklar /usr/local/lib, /usr/local/lib64, /usr/lib ve konumunda bulunur /usr/lib64; sistem başlangıç kitaplıkları /lib ve /lib64 dizinindedir. Ancak programcılar kitaplıkları özel konumlara kurabilirler.

Kütüphane yolu, bir komut satırı düzenleyicisiyle düzenleyebileceğiniz /etc/ld.so.conf dosyasında tanımlanabilir.

vi /etc/ld.so.conf 

Bu dosyadaki satır(lar) çekirdeğe dosyayı /etc/ld.so.conf.d dizinine yüklemesi talimatını verir. Bu şekilde, paket bakımcıları veya programcılar kendi özel kütüphane dizinlerini arama listesine ekleyebilirler.

/etc/ld.so.conf.d dizinine bakarsanız, bazı yaygın paketler için (çekirdek, mysql ve postgresql) .conf dosyalarını görürsünüz. bu durum):

ls /etc/ld.so.conf.d

kernel-2.6.32-358.18.1.el6.x86_64.conf  kernel-2.6.32-696.1.1.el6.x86_64.conf  mariadb-x86_64.conf
kernel-2.6.32-642.6.2.el6.x86_64.conf   kernel-2.6.32-696.6.3.el6.x86_64.conf  postgresql-pgdg-libs.conf

Mariadb-x86_64.conf dosyasına bakarsanız paket kitaplıklarına giden mutlak bir yol göreceksiniz.

cat mariadb-x86_64.conf

/usr/lib64/mysql

Yukarıdaki yöntem kitaplık yolunu kalıcı olarak ayarlar. Geçici olarak ayarlamak için komut satırında LD_LIBRARY_PATH ortam değişkenini kullanın. Değişikliklerin kalıcı kalmasını istiyorsanız bu satırı kabuk başlatma dosyasına /etc/profile (genel) veya ~/.profile (kullanıcıya özel) ekleyin.

export LD_LIBRARY_PATH=/path/to/library/file

Linux'ta Paylaşılan Kitaplıkları Yönetme

Şimdi paylaşılan kütüphanelerle nasıl başa çıkacağımıza bakalım. Bir ikili dosyaya ilişkin tüm paylaşılan kitaplık bağımlılıklarının bir listesini almak için ldd yardımcı programını kullanabilirsiniz. ldd'nin çıktısı şu biçimdedir:

library name =>  filename (some hexadecimal value)
OR
filename (some hexadecimal value)  #this is shown when library name can’t be read

Bu komut, ls komutu için tüm paylaşılan kitaplık bağımlılıklarını gösterir.

ldd /usr/bin/ls
OR
ldd /bin/ls
Örnek Çıktı
	linux-vdso.so.1 =>  (0x00007ffebf9c2000)
	libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003b71e00000)
	librt.so.1 => /lib64/librt.so.1 (0x0000003b71600000)
	libcap.so.2 => /lib64/libcap.so.2 (0x0000003b76a00000)
	libacl.so.1 => /lib64/libacl.so.1 (0x0000003b75e00000)
	libc.so.6 => /lib64/libc.so.6 (0x0000003b70600000)
	libdl.so.2 => /lib64/libdl.so.2 (0x0000003b70a00000)
	/lib64/ld-linux-x86-64.so.2 (0x0000561abfc09000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003b70e00000)
	libattr.so.1 => /lib64/libattr.so.1 (0x0000003b75600000)

Paylaşılan kütüphaneler pek çok farklı dizinde mevcut olabildiği için, bir program başlatıldığında bu dizinlerin tümünde arama yapmak büyük ölçüde verimsiz olacaktır; bu da dinamik kütüphanelerin olası dezavantajlarından biridir. Bu nedenle ldconfig programı tarafından gerçekleştirilen bir önbellekleme mekanizması kullanılır.

Varsayılan olarak ldconfig, /etc/ld.so.conf içeriğini okur, dinamik bağlantı dizinlerinde uygun sembolik bağlantıları oluşturur ve ardından /etc/ld.so.cache ve bu daha sonra diğer programlar tarafından kolaylıkla kullanılır.

Bu, özellikle yeni paylaşılan kitaplıklar yüklediğinizde veya kendi kitaplığınızı oluşturduğunuzda veya yeni kitaplık dizinleri oluşturduğunuzda çok önemlidir. Değişikliklerin geçerli olması için ldconfig komutunu çalıştırmanız gerekir.

ldconfig
OR
ldconfig -v 	#shows files and directories it works with

Paylaşılan kitaplığınızı oluşturduktan sonra yüklemeniz gerekir. Bunu yukarıda belirtilen standart dizinlerden herhangi birine taşıyabilir ve ldconfig komutunu çalıştırabilirsiniz.

Alternatif olarak, soname'den dosya adına sembolik bağlantılar oluşturmak için aşağıdaki komutu çalıştırın:

ldconfig -n /path/to/your/shared/libraries

Kendi kitaplıklarınızı oluşturmaya başlamak için Linux Belgeleme Projesi'ndeki (TLDP) bu kılavuza göz atın.

Şimdilik bu kadar! Bu yazıda size kütüphanelere bir giriş yaptık, paylaşılan kütüphaneleri ve bunların Linux'ta nasıl yönetileceğini anlattık. Paylaşmak istediğiniz sorularınız veya ek fikirleriniz varsa aşağıdaki yorum formunu kullanın.