본문 바로가기

프로그래밍/API

리눅스 - 동적라이브러리를 독립 메모리 공간에 적재하기

리눅스는 동적라이브러리(.so)를 메모리에 적재하는 API를 제공한다.

   void * dlopen(const char *pathname, int mode);
   void * dlmopen(Lmid_t lmid, const char *pathname, int mode);

해당 함수는 윈도우의 DLL과 같은 동적 라이브러리를 loading 하는 용도로 사용되어 진다.

이 방법은 다음과 같은 경우에 사용되어 질때 매우 유용하다.

   - 싱글 CPU기반으로 개발된 엔진(전역 변수가 많다.. ㅠ.ㅠ)
      : 쓰레드에 사용가능한 구조가 아닌 경우에 사용할때 유용하다.

그러나, 단점은 기존의 동적 로딩 방식에 비해 메모리 사용이 두배라는 점이다.

   void * dlmopen( LM_ID_NEWLM, const char *pathname, RTLD_LAZY);

로 동적라이브러리를 로딩하면 된다.

문제는 RTLD_GLOBAL | RTLD_LAZY 모드로 동적라이브러리를 로딩하면 바로 함수에 접근해 사용할수
있지만, 위의 방식으로 동적 라이브러리를 로딩하게 되면 dlsym() 함수를 통해 사용할 함수 포인터를
직접 얻어 와야 한다는 단점이 있다.

참고로, RTLD_GLOBAL을 사용하게 되면 동적 라이브러리가 프로그램 전체에 상주하게 되므로 메모리 접근에
문제가 발생될수 있으므로 사용 하지 말아야 한다.

이러한 방식으로, 각 쓰레드별로 동적라이브러리를 로딩해 사용하면 된다.