Linux Sistem Kütüphane Dosyalarını Anlamak
From Lapis Wiki
Bu makale NASIL bölümü serisinin bir parçasıdır
|
| MasaÜstü • Donanım • Ağ • Dağıtımlar |
| Tarayıcılar• Programlama • Linux ve Oyunlar |
Konu başlıkları |
Linux Sistem Kütüphane Dosyalarını Anlamak
Giriş
|
İnternet forumlarında ve mail listelerinde çok sıkla sorulan bir soru vardır: “libXXX.so.1 dosyasını bulamıyorum ve program çalışmıyor. Ne yapmalıyım?”. Eksik olan bu dosyalar genelde “lib” ön ekiyle başlar. Bunun anlamı; gerekli olan dosyanın bir “Shared Library” olduğudur. Yani gerekli olan ve bulunamayan, bir sistem kütüphanesinin dosyasıdır. “Shared Library” dosyaları aynen Windows'da olduğu gibi, sistemin merkezi bileşenlerinden birisidir. Doğru ve gerekli olan kütüphane dosyaları sistemde bulunmadığı sürece, birçok program çalışmayı reddeder. Windows altındaki sistem dosyaları “c:\\windows\system” ve “c:\\windows\system32” dizinleri altındadır. Bu dosyalara genelde DLL(Dinamic Link Library) son eki atanmıştır. Linux altında ise sistem dosyaları genelde 2 dizin altında bulunabilir. Bu dizinler “/lib” ve “/usr/lib” dizinleridir. Tabi alt dizinleri de mevcut olabilir.
|
Kiralık Kütüphane
|
Kütüphane deyince aklımıza ilk gelen; hani şu gerçek dünyadan bildiğimiz, içinde binlerce kitapların toplandığı bilgi yuvaları gelir. Herhangi bir bilgiye ihtiyacımız olduğunda veya bir kitap okumak istediğimizde, kütüphaneye gider, gerekli bilgilerin bulunduğu kitabı açar, ulaşmak istediğimiz bilgilere ulaşırız. Linux dünyasında da birçok programcı aynı prensip ile program yazabilir. Mesela bir “Editor” programı yazmak isteyen bir programcı, “Dosya Aç, Kaydet, Farklı Kaydet ” gibi fonksiyonları barındıran sistem kütüphanelerini gerekli sistem dosyasından kullanabilir; yani bir anlamda o sistem dosyasını kendi programı için kiralayabilir. Herkesin kullanımına izin verilen bu tür sistem dosyalarının ismi de zaten burdan gelir, yani ortak kullanılan kütüphanelerdir(Shared Librarys). Linux kütüphane dosyalarının en ünlüsü GlibC olarak bildiğimiz GNU C kütüphaneleridir. Bu kütüphanelerde, dosya okutmaktan tutun, aklınıza gelmeyen birçok işlem için gerekli fonksiyonları bulmak mümkündür. GNU C kütüphaneleri olmadan Linux altında çalışmak imkansızdır. Çünkü bütün Linux Programları öyle yada böyle GNU C kütüphanelerine bağımlıdır. Zaten dikkat ederseniz, GNU C kütüphanelerinde çok sık aralıklarda güncelleme yapılmaz. Şuanda sağlam güncel GlibC 2.2.3 dahi, nerdeyse 1 yıldan fazla bir çalışmanın ürünü ve 1 yıldan fazlada sağlamlığını sürdürmektedir. Bazı ufak tefek güncellemeler yapılmıştır fakat yapısal olarak büyük bir değişiklik söz konusu değildir. Aksi taktirde birçok programın Linux altında çalışmaması ve bu programları geliştiricilerin değişikliklere göre uyarlamaları söz konusu olurdu. Linux altındaki kütüphane dosyaları genelde belirli amaçların ortak kullanılması için yazılmıştır. Örnek olarak “libdvdcss” kütüphanesini ele alalım: Şifrelenmiş DVD filmerinin multimedya programları tarafından çalışmasını sağlayan fonksiyonları içerir. Aynı şekilde grafik, video ve müzik dosyalarının çalınmasını sağlayan kütüphane dosyalarıda mevcuttur. Sisteminizdeki kütüphane dosyalarının listesini görmek istiyorsanız, en basit olarak, kullandığınız Linux sürümünün paket yöneticisini açarak “librar” olarak aratma yaptığınızda karşınıza çıkan listedir(örnek, SuSE de YAST ile yada Pardus ta PİSİ ile kolayca bu bilgilere ulaşabilirsiniz.)
|
Kitabım Nerede?
|
Linux'un sürekli gelişmesine paralel olarak “Shared Library” dosyaları da değişmektedir. Genel olarak kütüphaneleri yeniden yazmak yerine, mevcut kütüphanelere ilave fonksiyonlar yapılma yöntemi kullanılmaktadır. Bunu bir kitaba benzetebilirsiniz: Bir kitap çıkar, aradan bir zaman geçer, sonra kitaba ilave veya düzelte bölümler yapmak isteyen yazar, gerekli ilaveleri yapar veya düzeltir, sona kitabın yeni sürümünü çıkartır. Eski bilgiler hala aynı yerde kaldığı için, okunan eski bilgiye ulaşmak okuyucu tarafından çok kolay olur. Bazen kitap o kadar eskimiş olur ki, yazar kitabı tekrar sıfırdan yazma ihtiyacı duyar. Bu durumda aranan kitapdaki gerekli olan bilgiye ulaşmak imkansız olur. Linux sistem kütüphane dosyalarını yukarda ki örneğe benzetebiliriz. “libdvdcss” kütüphanesini eğer ğeliştiricileri tarafından bir değişikliğe uğrarsa veya çok derin bir değişiklik yapma ihtiyacı duyarsa, bu işlem CD-Player programı geliştiricilerini de etkiler(KsCD, Xmms veya Kaffeine gibi). Multimedya programı geliştiricileri geliştirdikleri programı tekrar gözden geçirmek ve yeni kütüphaneler ile çalışır hale getirmek ihtiyacı duyarlar. Windows'dan farklı olarak, Linux altında bir kütüphanenin farklı sürümlerini aynı anda (yani kurulu olarak) kullanabilirsiniz. Ancak bu işlemi gerçekleştirmek yeni Linux ile tanışan bir kullanıcı için hem zahmetli hemde biraz tecrübe gerektiren bir işlemdir.
|
“ldd” Komutu ile Takip
|
“ldd /program_yolu/program” komutu ile bir programın kullandığı kütüphane dosyalarını kolayca tespit edebilirsiniz: $ ldd /usr/bin/amixer linux-gate.so.1 => (0xffffe000) libm.so.6 => /lib/libm.so.6 (0xb7fb0000) libasound.so.2 => /usr/lib/libasound.so.2 (0xb7efc000) libdl.so.2 => /lib/libdl.so.2 (0xb7ef8000) libpthread.so.0 => /lib/libpthread.so.0 (0xb7ea6000) libc.so.6 => /lib/libc.so.6 (0xb7d90000) /lib/ld-linux.so.2 (0xb7feb000) Burdan çıkan sonuç, “amixer” programının çalışması için gerekli olan sistem kütüphanelerinin ismi ve adresidir. Eğer bir sistem dosyası eksik olsaydı yukarda ki listede bunu açık bir şeklide görebilirdiniz. Yalnız bazı istisnalar olabilir, onları da aktarmakta fayda var: Open Office, Mozilla Firefox, Thunderbird gibi büyük projeler de “Shared Library” kullanmayabilir. Böyle büyük çaplı projeler kendi kütüphanelerini kendi içinde barındırabilirler. Yani sistem kütüphanelerine fazla bağımlı kalmadan çalışırlar. Sistemde hangi kütüphanelerin kurulu olduğu veya hangi Linux sürümü kullanıldığı bu türdeki programlar için önemli değildir. Fakat bu bir dezavantajıda beraberinde getirir: Open Office, Firefox, Thunderbird gibi programlar kendi kütüphanelerini kullandıkları için RAM harcamaları biraz fazladır. “ldd” komutu da aslında statik olarak link edilmiş bir programdır. “ldd `which ldd`” komutunu verdiğimizde aşağıdaki hatayı alırsınız: $ ldd `which ldd` not a dynamic executable Yani Linux altında oldukça çok bulunan çalıştırışabilir bir skript dosyasıdır: $ file `which ldd` /usr/bin/ldd: Bourne shell script text executable Bu yüzden skript ile binary dosyasını arasındaki farkı ayırt etmek gerekir. “ldd” size yardımcı olması için kullanırken dikkatli bir şekilde anlayarak kullanmak gerekir. Bu sayede aradığınız hata sonucuna ulaşmanız daha kolay olur.
|
Pratikde Rastlanan Tipik Kütüphane Problemleri
|
Linux altında pratikde 3 farklı şekilde kütüphane sorunları ile karşılaşabilirsiniz. Bunları aşağıdaki şekilde grublandırabiliriz:
|
Gerekli olan kütüphaneler kurulu değildir
|
Bu sorun genelde daha çok yeni kurulan Linux sürümlerinde rastlanan bir olaydır. Çözümüde oldukca basittir. Gerekli olan kütüphane dosyaları kurulum CD'si içindedir ve CD'den gereli kütüphaneyi kurmak ile çözüme ulaşabilirsiniz. Örnek olarak, bir programın kurulumu esnasında “libdv.so.4” dosyası olmadığı için kurulamadığını farz edelim. Böyle bir durumda ilk yapmanız gereken, gerekli olan “libdv.so.4” dosyasının hangi paket içinde olduğuna bakmak olmalıdır. Kullandığınız Linux sürümündeki paket yönetici programı (veya apt-get ilede olur) size bu konuda çok yardımcı olacaktır.
SuSE kullandığınızı farz edersek, “pin (Package InformatioN)” programı size bu konuda yardımcı olacaktır: $ pin libdv.so.4” komutu size gerekli olan paketin ismini söyleyecektir. Mandrake altında ise “rpmdrake” programını kullanabilirsiniz. Fedora/Redhat gibi RPM basisli sürümlerde ise “rpm” ve “yum” komutlarını kullanabilirsiniz: $ rpm -q --whatprovides libdv.so.4 $ yum search libdv.so.4 Not: Yukardaki 1. komut sadece gerekli olan paket kurulu olduğu zaman size doğru sonucu verir. 2. Komut ise kurulu olmayan paketlerde de arama yaparak sizi en doğru sonucu verir.
|
Gerekli olan kütüphanenin doğru olan sürümü kurulu değildir
|
Bu tür sorunlarda, sistemde gerekli olan kütüphanenin gerekli olan sürümü sistemde olmadığı zamanlar baş gösteren sorunlardır. Burda dikkat edilmesi gereken, paket isimleri aynı olabilir fakat içinde barındırdıkları kütüphane sürümleri farklılık olmasından doğan hatalardır. Genelde yeni Linux kullanıcıları bu hataları algılayamazlar. “Efet sistemimde gerekli olan paket kurulu ama çalışmıyor” gibisinden cevaplar verirler. Sisteminizde gerekli paketin kurulu olması, gerekli olan sistem kütüphanesinin kurulu olduğu anlamını vermez. Mesela sisteminizde “libdv.so.2” dosyasının mevcut olduğunu farz edelim. Bu dosya “libdv” paketinin içindedir. Bir program çalıştırmak istediğinizde “libdv.so.4” dosyasının sisteminin olmadığından şikayet ederek çalışmayabilir. Genelde yapılan tipik hata, ilk önce paketin sistemde olup olmadığının kontrol edilmesi. Buda tabiki yanlıştır. Paket sisteminizde mevcut olabilir fakat paketin en güncel ve gerekli olan sürümü sisteminizde bulunmadığı için program çalışmaz. Bu durumda, içinde “libdv.so.4” dosyasını barındıran “libdv” en günce paketini kurmanız gerekir. Bazen bunun akside olabilir. “libdv.so.4” dosyası sistemde mevcut olduğu halde, bir program çalışmak için “libdv.so.2” adında eski bir sürümün kütüphane dosyasını isteyebilir. Böyle bir olay karşısında sistemi geriye doğru güncellemek yerine, basit bir “ln” komutunun yardımı ile programı çalışmaya ikna edebilirsiniz: $ ln -s /usr/lib/libdv.so.4 /usr/lib/libdv.so.2 Sürüm numaraları büyük olan kütüphane dosyaları genelde geriye uyumludur. Bu yüzden yukardaki basit sembelik bağlantı yapma yöntemi ile programı çalıştırma olasılığınız oldukça fazladır. Tabi çalışmayabilir de, bu durumda eski sürümü kullanmaktan başka çareniz malesef yok gibi.
|
Doğru kütüphane kurulu olmasına rağmen sistem bu dosyaları bulamamaktadır
|
Bazen doğru kütüphanenin doğru sürümü olsa dahi çalışmayan program çıkabilir. Bunun birtek sebebi vardır, oda doğru kütüphanenin doğru dizin altında bulunmamasıdır. Programın kurulumu esnasında çıkan hata mesajlarına dikkat ederseniz, ne demek istediğimi sanırım çok iyi anlarsınız. Örneğin bir program kurulumu esnasında “/usr/lib” dizini altında, atıyorum, “abc.so.1” dosyasını arayabilir. Oysa gerekli olan kütüphane “/usr/local/lib/abc.so.1” dizini altında olabilir. Böyle bir durumda ilk önce dosyanın sistemde mevcut olup olmadığını araştırmak, ve sonra kurulum esnasında nerde arama yaptığını bulmak en mantıklı yoldur(configure.log dosyası size bütün detayları gösterir). Diğer bir olasılıkta sistem kütüphane veri bankasının eskimiş olması olabilir. Bu durumda root kullanıcısı olarak “ldconfig” komutunu vererek tazeleme yapabilirsiniz. Yeri gelmişken burda “/etc/ld.so.conf” dosyasına değinmeden geçemeyiz.
|
“/etc/ld.so.conf” ve “/etc/ld.so.cache” Dosyaları
|
Linux altında bir program başlarken birçok sistem kütüphanesine ihtiyaç duyabilir. Linux altındaki sistem kütüphanelerinin yolları ve nerde bulundukları “/etc/ld.so.cache” dosyasının içindeki veri bankasında saklıdır. Bu dosya içinde kütüphanelerin isimleri, sürümleri, sistemde bulundukları kısayollar birer birer saklıdır. Bu veri bankası normal olarak her Linux boot işlemi esnasında yenilenir. Yani dosya yenilenir. Her boot esnasında sistem tarafından yenilendiği gibi, çalışan sistem esnasında da “ldconfig” komutu yardımı ile bu veri bankasının yenilenmesini sağlayabilirsiniz. “ldconfig” komutu sadece root kullanıcısı tarafından uygulanabilir. “/etc/ld.so.cache” dosyası bütün bilgilerini “/etc/ld.so.conf” dosyasından okur. “ld.so.conf” dosyasının içinde ise sistemin içinde barındırdığı kütüphanelerin kısayolları tanımlıdır ve genelde aşağıdaki gibi bir görüntüsü vardır: $ cat /etc/ld.so.conf # ld.so.conf autogenerated by env-update; make all changes to # contents of /etc/env.d directory /usr/local/lib /usr/lib/opengl/xorg-x11/lib /usr/i686-pc-linux-gnu/lib /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.4 /usr/lib /opt/sun-jdk-1.4.2.07/jre/lib /usr/qt/3/lib /usr/kde/3.3/lib /usr/kde/3.2/lib /usr/games/lib /usr/lib/libstdc++-v3/ Sanırım vermek istediğim mesajı algıladınız: Yukarda ki dosyadan da anlaşıldığı üzere, eğrer sistemde kurulu olan kütüphane dosyasının yolu “ld.so.conf” dosyasının içinde tanımlanmamış ise bulunamaz ve hata verir. Oysa kütüphane sistemde kuruludur, fakat bulunamadığı için “ld.so.cache” veri bankasının içinde bilgileri mevcut değildir. Mevcut olmadığı içinde sistemde yok veya kurulmadı olarak alğılanır. Böyle bir durumda yapmanız en güvenli yöntem, bu gerekli olan kütüphanelerin “ld.so.conf” dosyasına kısayollarının tanımlanması, ilave edilmesi ve “ldconfig” komutunun uygulanarak cache dosyasının içine kaydedilmesini sağlamak olmalıdır.
Erkan Kaplan E-Lapis Dergisi http://www.linux-sevenler.org Sayı 1
|
