학습자료(~2017)/리눅스

[LINUX] Library constructor and destructor functions (라이브러리 생성자, 소멸자 기능 _init , _fini)

단세포소년 2013. 3. 21. 10:24
반응형

리눅스 라이브러리의 생성자와 소멸자를 등록하는 방법은 2가지가 있다.

라이브러리 생성자나 소멸자는 라이브러리 전역에서 쓰이고 한번만 초기화 되어야 하는 객체에 사용하라. 예를 들어 전역적으로 쓰이는 변수, mutex 등을 말한다.


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

 생성자(constructor) 는 dlopen 이 반환되기 전이나 혹은 라이브러리가 로드 될 때에 실행된다.
 소멸자(destructor) 는 dlclose 가 반환되기 전에 혹은 exit()나 main() 이 끝날때 실행된다.

중요 : 공유 라이브러리는 컴파일시 -nostartfiles 혹은 -nostdlib 옵션이 들어가면 안된다. 만약 이 argument들이 사용되었다면 생성자나 소멸자는 실행되지 않는다. 



비추천

  void _init(void)
  void _fini(void)

 
이 방법은 더이상 쓸모가 없고 위험한 방법이다. 오래된 시스템이나 코드에서만 사용하라.

gcc 옵션에 -nostartfiles 를 추가한 상태로 라이브러리를 만들어야한다. 그렇지 않으면 multiple-definition 에러가 발생할 것이다.


반응형