Dinamik Kütüphanelerin Oluşturulması
Dinamik kütüphaneler ld linker’ı ya da cc/gcc derleyicileri ile –shared switch’i
kullanılarak oluşturulur. Örneğin;
gcc –o mylib.sa –shared mylib.o
Burada mylib.o dosyasından mylib.sa isimli bir dinamik kütüphane oluşturulmuştur.
İşlem şöyle de yapılabilirdi.
gcc –o mylib.sa –shared mylib.c
Burada mylib.c derlenerek mylib.o elde edilmiştir ve bu da dinamik kütüphaneye
yerleştirilmiştir.
Dinamik Kütüphanelerin Kullanılması
Tıpkı Windows sistemlerinde olduğu gibi dinamik kütüphanelerin yükleyici tarafından
program çalışırken yüklenmesi ve daha sonra yüklenmesi seçenekleri Unix/Linux
sistemlerinde de söz konusudur. Ancak Unix/Linux sistemlerinde import kütüphanesi kavramı
yoktur. Kütüphanenin kendisi yine link işleminde kullanılmaktadır. Örneğin bu işlem şöyle
yapılabilir.
gcc –o use use.c mylib.sa
Ancak yine de mylib.sa dinamik kütüphanesinin özel bir dizinde bulunması gerekir. Örneğin
/usr/lib dizini tüm sistemlerde özel dizin olarak kullanılır.
Sınıf çalışması: Bir dinamik kütüphane oluşturunuz. Daha sonra bu dinamik kütüphaneyi bir
program yoluyla kullanınız.
ldd Programı
Bir programın hangi dinamik kütüphaneleri kullandığı ldd programı ile tespit edilebilir.
Sınıf çalışması: Bir dinamik kütüphane yaratınız, başka bir programda o dinamik
kütüphaneden çağırma yapınız. Sonra ldd programı ile rapor alınız.
Dinamik Kütüphanelerin Dinamik Yüklenmesi
Dinamik kütüphanelerin yüklenme ayrıntıları ileride ele alınacaktır. UNIX/Linux
sistemlerinde de tıpkı Windows sistemlerinde olduğu gibi bir dinamik kütüphane
programcının istediği bir zaman yüklenebilir.
Win32 Sistem Programcısı İçin Notlar: Win32’de bir dinamik kütüphane programın çalışma
zamanı sırasında LoadLibrary API fonksiyonu ile yüklenebilir. Daha sonra dinamik
kütüphaneden istenilen bir fonksiyonun adresi GetProcAddress fonksiyonu ile elde
edilebilmektedir. Dinamik kütüphanelerin boşaltılması FreeLibrary fonksiyonu ile
yapılmaktadır.
UNIX/Linux sistemlerinde de tamamen benzer bir mekanizma kullanılmaktadır. Bu
sistemlerde tipik olarak dlopen LoadLibrary gibi, dlsym GetProcAddress gibi ve
dlclose FreeLibrary fonksiyonu gibi işlem görmektedir.
dlopen Fonksiyonu
Dinamik kütüphane dlopen fonksiyonu ile yüklenerek kullanıma hazır hale getirilebilir.
void *dlopen(const char *filename, int flag);
Fonksiyonun birinci parametresi dinamik kütüphane dosyasının ismidir. Birinci
parametredeki path / ile başlatılmamışsa sistem dosyayı belirlenen bazı dizinlerde arar. Eğer
path / ile başlatılmışsa sistem dosyayı yalnızca belirtilen yerde arar. Sistem ile belirlenen
dizinler UNIX sistemleri arasında farklılıklar gösterebilmektedir. Genellikle otomatik bakılan
dizinler şunlardır:
1) LD_LIBRARY_PATH çevre değişkeni ile belirtilen dizinler.
2) /usr/lib ve /lib dizinleri
Dinamik yüklemede kullanılan fonksiyonlar lib.c (standart C) kütüphanesi içerisinde değildir.
Pek çok UNIX ve Linux sistemlerinde bu fonksiyonlar libdl.a kütüphanesinin
içerisindedir. Bu nedenle derleme yapılırken bu kütüphanenin de link aşamasında eklenmesi
gerekir. Örneğin;
gcc –o den –ldl den.c
ve ya
gcc –o den den.c /usr/lib/libdl.a
Dinamik kütüphane kullanımına örnek:
/* libmylib.c */
#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
gcc –o mylib.so -shared mylib.o
/* usedynamiclib.c */
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
typedef int (*PFUNC) (int, int);
int main()
{
void *handle;
PFUNC pAdd;
handle = dlopen(“/home/student/libmylib.so”, RTLD_NOW);
if (handle == NULL) {
fprintf(stderr, dlerror());
exit(EXIT_FAILURE);
}
pAdd = (PFUNC) dlsym(handle, “add”);
if (pAdd == NULL) {
fprintf(stderr, dlerror());
exit(EXIT_FAILURE);
}
printf(“%d”, pAdd(100, 200));
dlclose(handle);
return 0;
}