문제

공유 라이브러리가로드 될 때 "알림"을받을 수있는 방법이 있습니까?

다시 말해, 내가 사용한다고 가정 해 봅시다 dlopen 공유 라이브러리에는 공유 라이브러리 (예 : 메인?)에서 자동으로 호출 된 (현재) 기능이 있습니까?

도움이 되었습니까?

해결책

라이브러리는 GCC __attribute __ ((생성자)) 및 __attribute __ ((Destructor)) 함수 속성을 사용하여 초기화 및 정리 루틴을 내보내야합니다. 이에 대한 정보는 GCC 정보 페이지를 참조하십시오. 생성자 루틴은 dlopen 반환 전에 실행됩니다 (또는 라이브러리가로드 시간에로드되면 main ()가 시작되기 전에). Dlclose가 반환되기 전에 (또는 exit () 또는 main ()가 부하 시간에로드 된 경우 main ()이 완료되기 전에 소멸기 루틴이 실행됩니다. 이러한 기능에 대한 C 프로토 타입은 다음과 같습니다.

 void __attribute__ ((constructor))  my_init(void);  
 void __attribute__  ((destructor)) my_fini(void);

가져 왔습니다 http://tldp.org/howto/program-library-howto/index.html

즉, 공유 라이브러리가로드 될 때 호출하려는 함수에 대해 __attribute__ ((생성자))를 처리합니다. 위의 docuemtn은 또한 구형 _ini 및 _fini 함수가 쓸모없는 것으로 간주된다고 지적합니다.

다른 팁

예. 라이브러리가 열리면 모든 정적 구조가 이루어집니다 ... 따라서 C ++를 사용하면 다음을 수행 할 수 있습니다.

// mylibrary.cpp
namespace
{
    class dynamic_library_load_unload_handler
    {
         public:
              dynamic_library_load_unload_handler(){
                    // Code to execute when the library is loaded
              }
              ~dynamic_library_load_unload_handler(){
                    // Code to execute when the library is unloaded
              }
    } dynamic_library_load_unload_handler_hook;
}

와는 달리 __attribute__ ((constructor)) 주어진 솔루션은 휴대용입니다. 그러나 이와 같은 여러 개체가있는 경우 건축/파괴 순서와 관련하여 보장 할 수 없습니다.

적어도 Linux와 아마도 다른 UNIX 시스템에서 라이브러리가 동적으로 이름이 지정된 글로벌 기능을 열면 _init, 그것이 존재하는 경우, 동적 링커로 호출됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top