Derleme Zamanında Kütüphanelerin Aranma Sırası

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.

results matching ""

    No results matching ""