dlsym(3)

#include <dlfcn.h>

void *dlsym(void *handle, const char *symbol);

이 함수는 dlopen(3)으로 loading한 shared object에서 함수 또는 변수의 pointer를 얻는 함수입니다. return되는 type이 void* 이므로, return된 symbol의 type에 맞는 변수에 type casting을 해야 합니다.

만약, symbol이 함수이면 함수 pointer 변수를 선언해야 하며, 변수이면 변수에 맞는 type을 선언합니다.

 

링크시 -ldl 추가 필요

 

파라미터

handle
    - dlopen(3)으로 return 받은 shared object handle
symbol
    - shared object에서 찾고하자 하는 함수명 또는 변수명 등

 

RETURN

NULL
    - symbol 정보를 찾지 못하였거나 원래 Symbol의 pointer NULL입니다.
    - dlerror(3)를 호출시에 NULL이 return되었다면 정상이라는 의미입니다.(즉, NULL값이 맞다는 의미) 
    - symbol이 만약 함수를 찾는 것이었다면 오류입니다.

NULL 아님
    - symbol (함수명, 변수명 등)이 위치하는 메모리 번지

 


 

 

함수포인터 변수 선언하는 방법 - char *util_strcat(char *dest, const char *src);를 함수 포인터로

함수 Pointer 변수명을 ptr_strcat이라고 정하였다면

1. 사용할 함수의 prototype에서 함수명만 함수 Pointer 변수명으로 변경합니다.
    char *util_strcat(char *dest, const char *src);
    ->
    char *ptr_strcat(char *dest, const char *src);

2. 함수명을 괄호로 묶은 후에 함수명 앞에 *를 붙여줍니다. 
    char *(*ptr_strcat)(char *dest, const char *src); 


3. 파라미터의 가변수 명을 없앱니다.
    char *(*ptr_strcat)(char *, const char *); 

4. NULL로 초기화까지 하려면 = NULL 해주면 됩니다.
    char *(*ptr_strcat)(char *, const char *) = NULL; 

 

 

 


활용 예제

 

Sample

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

int main(int argc, char **argv)
{
    void *handle;
    double (*cosine)(double);
    char *error;

    handle = dlopen("libm.so", RTLD_LAZY);
    if (!handle) {
        fprintf(stderr, "%s\n", dlerror());
        exit(EXIT_FAILURE);
    }

    dlerror();    /* Clear any existing error */
    /* Writing: cosine = (double (*)(double)) dlsym(handle, "cos");
       would seem more natural, but the C99 standard leaves
       casting from "void *" to a function pointer undefined.
       The assignment used below is the POSIX.1-2003 (Technical
       Corrigendum 1) workaround; see the Rationale for the
       POSIX specification of dlsym(). */

    *(void **) (&cosine) = dlsym(handle, "cos");

    if ((error = dlerror()) != NULL)  {
        fprintf(stderr, "%s\n", error);
        exit(EXIT_FAILURE);
    }

    printf("%f\n", (*cosine)(2.0));
    dlclose(handle);
    
    return 0; 
}

 


 

see also: Shared Library 관련 API

 

 

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요