Linux Sistem Programlama
  • Kapak
  • Önsöz
  • Sistem Programlamaya Giriş
    • Tarihçe
    • Standartlar
    • Sistem Çağrıları
    • API ve ABI
  • Linux Çekirdeği
  • Kabuk
  • Dosya Sistemi
  • Kullanıcı, Grup ve Erişim Yetkileri
  • Process Kavramı
  • Dosya İşlemleri
  • IO Modelleri
    • Senkron IO
    • Asenkron IO
  • Sinyaller
    • Temel Kavramlar
    • Sinyal Yakalama ve Gönderme
    • Signal-Safe Kavramı
    • Sinyal Kümeleri
    • Sinyal Bloklama
    • Sinyal İle Birlikte Veri Gönderimi
    • Sinyal ve Core Dump
    • RealTime Sinyaller
    • File Descriptor Üzerinden Sinyal İşleme
    • Genel Değerlendirme
  • Thread Kullanımı
    • Thread Oluşturma
    • Thread Türleri
    • Thread Sonlandırma
    • Mutex Kullanımı
    • SpinLock & Mutex Karşılaştırması
    • Futex
  • Semafor Kullanımı
    • Semafor ve Mutex Karşılaştırması
    • Semafor Türleri
    • Semafor Operasyonları
  • Shared Memory Kullanımı
  • Memory Mapped IO
  • Soket Kullanımı
    • Soket API
    • TCP Soketleri
    • UDP Soketleri
    • UNIX Soketleri
    • Birden Çok İstemciyle Çalışma
  • Timer Kullanımı
    • Basit Timer Yapıları
    • POSIX Timer API
    • Event Loop İçinde Kullanım
  • Daemon Oluşturma
  • Capabilities API
  • Paylaşımlı Kütüphaneler
    • Kütüphane Gereksinimi
    • Statik Kütüphaneler
    • Kod Referanslarının Ele Alınması
    • Paylaşımlı Kütüphanelerin Oluşturulması
    • Dinamik Yükleme
    • Derleme Zamanında Kütüphanelerin Aranması
    • Çalışma Zamanında Kütüphanelerin Aranması
    • Statik ve Dinamik Kütüphanelerin Beraber Kullanılması
    • Versiyon Yönetimi
  • Process'ler Arası Haberleşme
  • Memory Allocation
  • Memory Barriers
  • Hata Ayıklama Yöntemleri
    • GNU Debugger
    • Strace
  • GNU Build Sistemi Araçları
    • Make
    • Autoconf, Automake
  • Ek Bölümler
    • Derleyici Optimizasyonları
    • Clang ve LLVM
    • İçsel ve Anonim Fonksiyonlar
      • İçsel Fonksiyonlar
      • Anonim Fonksiyonlar
    • FreeTDS ile SqlServer Bağlantısı
  • Kaynak Dosyalar
Powered by GitBook
On this page

Was this helpful?

  1. Paylaşımlı Kütüphaneler

Derleme Zamanında Kütüphanelerin Aranması

Statik bağlayıcıya gerekli kütüphaneler yol ifadeleriyle beraber geçirebildiği gibi yalnız isimleri de kullanılabilir. Yalnız isimlerinin geçirildiği durumda kütüphane dosyalarının nerede olduğu bilinemediğinden aranması gerekmektedir. Bağlayıcı öntanımlı olarak bazı dizinlere bakmaktadır. Ayrıca kullanıcının yeni arama dizinleri eklemesine izin verilmiştir. Yeni bir arama dizini eklemek için -L seçeneği kullanılmaktadır. Bu şekilde belirtilen dizinlere öngörülenlerden daha önce bakılmaktadır. -L seçeneği komut satırında istenilen sayıda kullanılabilmektedir. Kütüphane dosyalarının yalnız isimlerinin kullanılabilmesi için libXXX.so şeklinde isimlendirilmeleri gerekmektedir.

Basit bir örnek üzerinde bu durumu inceleyelim. Örnekleri sırasıyla driver.c ve test.c adlarıyla saklayabilirsiniz.

void foo();

int main() {
    foo();
    return 0;
}
void foo() {
    puts(__func__);
}

Kütüphane dosyamızı oluşturalım.

$ gcc -fPIC -shared -olibtest.so test.c

Uygulamamızı ilk olarak kütüphane dosyasını göstermeden derlemeyi deneyelim.

$ gcc -odriver driver.c
/tmp/ccUapyFF.o: In function `main':
driver.c:(.text+0xa): undefined reference to `foo'
collect2: error: ld returned 1 exit status

Bağlayıcı, foo fonksiyonunu bulamadığından şikayet etmekte. Bağlayıcı öntanımlı olarak baktığı dizinlerde foo tanımını içeren herhangi bir kütüphane (libtest.so) bulamadığından bu hata mesajını vermektedir. Bu durumda aşağıdaki yöntemleri kullanabiliriz. Öncesinde incelememizi kolaylaştırmak için bulunduğumuz dizinde lib isminde bir dizin oluşturup libtest.so dosyasını bu dizine taşıyalım.

$ mkdir lib
$ mv libtest.so lib

1. Kütüphane yol ifadesiyle beraber geçirilebilir.

    $ gcc -odriver driver.c lib/libtest.so

2. Kütüphane isminden önce aranacak dizinlere kütüphanenin bulunduğu dizin yolu eklenebilir. Kütüphane libXXX.so şeklinde isimlendirilmesi durumunda bağlayıcıya -lXXX şeklinde geçirilmelidir.

    $ gcc -odriver driver.c -Llib -ltest

Bağlayıcı tarafından bakılan tüm dizin kümesini merak edebilirsiniz. Bağlayıcının öntamımlı olarak baktığı arama dizinleri, içsel olarak kullanıdığı bağlayıcı betiğinde (linker script) tanımlanmıştır. Bu dizinleri aşağıdaki gibi öğrenebiliriz.

$ ld --verbose | grep SEARCH_DIR

SEARCH_DIR("=/usr/x86_64-linux-gnu/lib64"); SEARCH_DIR("=/usr/local/lib/x86_64-linux-gnu"); SEARCH_DIR("=/usr/local/lib64"); SEARCH_DIR("=/lib/x86_64-linux-gnu"); SEARCH_DIR("=/lib64"); SEARCH_DIR("=/usr/lib/x86_64-linux-gnu"); SEARCH_DIR("=/usr/lib64"); SEARCH_DIR("=/usr/x86_64-linux-gnu/lib"); SEARCH_DIR("=/usr/local/lib"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib");

gcc ile derleme işlemi yaparken --verbose seçeneğinin geçirilmesi durumunda, bağlayıcıya çok sayıda -L anahtarıyla dizin yolunun geçirildiğini görmekteyiz. gcc tarafından ilave olarak bağlayıcıya geçirilen arama dizin listesine de aşağıdaki gibi ulaşabiliriz.

$ gcc -print-search-dirs | grep libraries

libraries: =/usr/lib/gcc/x86_64-linux-gnu/4.9/:/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../x86_64-linux-gnu/lib/x86_64-linux-gnu/4.9/:/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../x86_64-linux-gnu/lib/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../x86_64-linux-gnu/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/4.9/:/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../lib/:/lib/x86_64-linux-gnu/4.9/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/4.9/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../x86_64-linux-gnu/lib/:/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../:/lib/:/usr/lib/

Ayrıca tüm bu dizinlerden önce siz de komut satırında -L ile istediğiniz dizinlerin aranmasını sağlayabilirsiniz.

PreviousDinamik YüklemeNextÇalışma Zamanında Kütüphanelerin Aranması

Last updated 5 years ago

Was this helpful?