본문 바로가기

study/C언어

dynamic library - dlopen(), dlsym(), dlclose()

UNIX/LINUX에서 shared library 또는 shared object를 compile 때가 아닌 runtime때 동적으로 메모리에 loading 하여 함수를 실행하기 위해서는 dlopen(), dlsym(), dlclose() 등을 이용하여 수행 할 수 있다.

#include <dlfcn.h> 
void *dlopen (const char *filename, int flag); 
const char *dlerror(void); 
void *dlsym(void *handle, const char *symbol); 
int dlclose (void *handle);

- dlopen()

#include <dlfcn.h> 
void *dlopen(const char *filename, int flag);

사용목적 : C언어에서 프로그램을 개발할 때 특정 기능을 사용하기 위하여 함수를 호출

이 함수들을 사용하기 위해서 원본 소스가 있는 경우에는 .c파일을 직접 컴파일을 하여 사용하거나 컴파일이 된 .o 파일 또는 여러 개의 .o 파일을 묶어 놓은 .a 파일 또는 .so 파일의 형태로 제공받아서 컴파일 후에 링크시에 프로그램과 연동

필요 시점에 shared object 파일을 메모리에 로딩하고 필요한 함수를 찾아서 실행하고 실행 후에 다시 메모리에 내리는 함수들이 dlopen ~ dlsym ~ dlclose 함수이다.

dlopen() 함수는 shared object 파일을 메모리에 로딩하거나 이미 메모리에 loading되어 있으면 shared object에 대한 참조 count를 1 증가 시키는 함수이다.

- dlsym()

dlsym() 함수는 shared library에 포함된 symbol(함수 또는 전역변수)의 위치에 대한 pointer 를 얻는다. - 함수 pointer

(loading한 shared object에서 함수 또는 변수의 pointer를 얻는 함수)

#include <dlfcn.h> 
void *dlsym(void *handle, const char *symbol);

 

출처