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.