내밥줄/리눅스

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

jjoell 2015. 3. 30. 10:39

리눅스 라이브러리의 생성자와 소멸자를 등록하는 방법은 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 에러가 발생할 것이다.



출처:http://onecellboy.tistory.com/263

'내밥줄 > 리눅스' 카테고리의 다른 글

QEMU 가상 USB, CD  (0) 2015.09.03
[펌]QEMU 이미지 마운트하기  (0) 2015.04.21
Ubuntu 12.04 vnc   (0) 2014.04.24
오프라인 apt-get 설치  (0) 2014.04.03
Fedora 19 로그인 시 회색 화면만 보이는 경우  (0) 2014.04.02