강좌 & 팁
글 수 2,412
2011.08.01 09:33:38 (*.138.143.120)
39266
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
좋은 자료 감사합니다 궁금한게 해결이 됬네요 ^^