dlsym
- C kursu
- İleri seviye
- Ders 50/83
- 5 dk
dlsym ile sembol çözümlemeyi öğrenirsin.
dlsym nedir?
dlsym, yüklenen kütüphaneden bir sembol (fonksiyon ya da değişken) adresini alır. void *sym = dlsym(h, "printf") ile printf fonksiyonunun adresini alırsın. Dönüş void *'dir; istediğin türe cast edersin.
Başarısızlıkta NULL döner; ama gerçek denetim dlerror ile yapılır (sonraki ders). dlsym ile alınan adresi bir fonksiyon işaretçisine cast edip çağırabilirsin: typedef void (*Fn)(void); Fn f = (Fn)dlsym(h, "foo"); f();. Test için dlsym(h, "printf") ana programdan genellikle başarılı döner.
Sembol çözümleme deseni
Tipik akış: void *h = dlopen(NULL, RTLD_LAZY);, void *sym = dlsym(h, "printf");, printf("sembol bulundu\n");, if (h) dlclose(h);. Bu, sembolün çözümlendiğini yazdırır.
Sembolün gerçekten çağrılması bir sonraki derste; burada yalnızca adresin alındığını gösteriyoruz. Çıktı deterministiktir: printf ana programda her zaman bulunur. Eğer farklı bir sembol ararsan ve bulunamazsa sym NULL olur; bu durumda dlerror hata iletisi verir.
Uygulama Sembol çözümle
void *h = dlopen(NULL, RTLD_LAZY); ile tanıtıcı al. void *sym = dlsym(h, "printf"); ile printf sembolünü çözümle. printf("sembol bulundu\n"); ile yazdır. if (h) dlclose(h); ile kapat.
Başlangıç kodu
#include <stdio.h>
#include <dlfcn.h>
// kütüphane yüklenir
// sembolü çözümle
// yazdır ve kapat
int main(void) {
return 0;
}Örnek çözüm
#include <stdio.h>
#include <dlfcn.h>
int main(void) {
void *h = dlopen(NULL, RTLD_LAZY);
void *sym = dlsym(h, "printf");
printf("sembol bulundu\n");
if (h) dlclose(h);
return 0;
}Beklenen çıktı
sembol bulundu
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 dlsym parçalarını eşle
| Kavram | Anlamı |
|---|---|
dlsym |
Sembol adresi |
void * |
Dönüş türü |
cast |
Türe çevirme |
NULL |
Hata |
2 dlsym çağrısı ne tür döner?
- int
- void * Doğru cevap
- char *
- long
Açıklama: dlsym void * döner; cast ederek kullanırsın.
3 dlsym çağrısı
void *sym = ____(h, "printf");
void *sym = dlsym(h, "printf");
Açıklama: dlsym, h tanıtıcısından sembol adresini alır.