CodeBlanks Logo Icon CodeBlanks

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

main.c
#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

main.c
#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ı

Soru
void *sym = ____(h, "printf");
Cevap
void *sym = dlsym(h, "printf");

Açıklama: dlsym, h tanıtıcısından sembol adresini alır.

İleri seviye bölümündeki tüm dersler