C 코딩을 하다 보면 main 함수가 항상 먼저 실행된다고 알고 있다.
하지만 gcc 의 확장기능에는 main 함수 이전에 함수를 실행시킬수 있는 방법이 있다.

__attribute__((constructor))   라는 확장자를 함수에 붙여주면 해당 함수는 main 함수가 실행되기 전에 수행된다.

 1 #include <stdio.h>
 2 
 3 __attribute__((constructor)) void foo(void)
 4 {
 5     printf("before main call\n");
 6 }
 7 
 8 int main(void)
 9 {
10 
11     printf("hello world\n");
12 
13     return 0;
14 }
15 

실행 결과는 아래와 같다.
[root@falinux ~]$ /mnt/nfs/before.out 
before main call
hello world


두개 이상에 붙이는 것도 가능하다.
 1 #include <stdio.h>
 2 
 3 __attribute__((constructor)) void foo(void)
 4 {
 5     printf("before main call\n");
 6 }
 7 
 8 __attribute__((constructor)) void foo1(void)
 9 {
10     printf("before main call1\n");
11 }   
12 
13 int main(void)
14 {
15 
16     printf("hello world\n");
17 
18     return 0;
19 }
20 

[root@falinux ~]$ /mnt/nfs/zeroboot/before.out 
before main call
before main call1
hello world



그렇다면 해당 프로그램이 종료될때 수행시킬수 있는 방법도 있을까? 물론 있다.
__attribute__((destructor))  확장명령을 사용하면 가능하다.
 1 #include <stdio.h>
 2 
 3 __attribute__((constructor)) void foo(void)
 4 {
 5     printf("before main call\n");
 6 }         
 7             
 8 __attribute__((destructor)) void foo1(void)
 9 {                   
10     printf("after main call\n");
11 }                       
12                               
13 int main(void)                  
14 {                                    
15                                       
16     printf("hello world\n");           
17                                             
18     return 0;                                
19 }                                                 
20           

결과는 아래와 같으면 main 함수의 실행전과 실행후에 실행되는 것을 확인할수 있다.  
[root@falinux ~]$ /mnt/nfs/zeroboot/before.out 
before main call
hello world
after main call  
 
 
보통은 이러한 것을 사용할 일이 없지만 시그널 핸들러를 설정한다거나 하는 경우에 사용하기도 한다.



참조및 출처  : Binary Hacks - O'REILLY