iOS, C/C++에서 main함수보다 먼저 실행하고 싶은 코드가 있을 수 있다. 가령, iOS앱 시작 전에 디바이스 정보를 먼저 얻어온 후 앱을 시작하는 경우나, 사용 Class의 초기화 등의 경우가 이에 해당한다.
이런 상황에서 __attribute__((constructor)) 옵션을 지정한 함수를 선언하여 해결할 수 있다.
본론
1. __attribute__((constructor)) 란?
서론부에서 설명한 것 처럼 GCC에서 제공하는 옵션이다. 이 옵션을 지정한 함수는 main함수 실행 이전에 호출되어 함수의 로직을 수행하게 된다.
1-1) __attribute__((constructor))을 지정한 함수 선언 방법 예시
1 2 3 4 | void __attribute__((constructor)) before_main( void ) { /* Things to do before main function */ } |
위와 같이 간단한 형태로 정의 할 수 있다.
1-2) __attribute__((constructor))가 여러개인 경우의 처리
만약 메인 이전에 수행하고싶은 함수의 개수가 두 개 이상인 경우의 처리는 어떻게 하면 될까?
이러한 경우에는 함수의 Priority를 지정할 수 있는 방법이 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | int my_constructor(void) __attribute__((constructor)); int my_constructor2(void) __attribute__((constructor(101))); int my_constructor3(void) __attribute__((constructor(102))); int my_constructor(void) /* This is the 3rd constructor */ { /* function to be called */ ... return 0; } int my_constructor2(void) /* This is the 1st constructor */ { /* function to be called */ ... return 0; } int my_constructor3(void) /* This is the 2nd constructor */ { /* function to be called */ ... return 0; } |
위의 예시 코드에서 볼 수 있듯이 우선순위를 지정하지 않고 default로 선언을 한 경우에는 가장 후 순위로 지정되는 것을 알 수 있으며, 여러 개의 constructor함수가 default선언이 된 경우, 스택 방식으로 먼저 발견되는 함수가 나중에 호출되는 순서를 가진다.
결론
GCC옵션 중 __attribute__((constructor))를 이용하여 메인 함수 이전에 실행되는 함수를 선언하는 방법에 대해서 알아보았다.
이 옵션과 반대의 옵션인 __attribute__((desstructor)) 옵션을 주면 메인 함수 이후에 실행되는 함수 또한 선언하여 사용 할 수 있고, 이 두 함수의 조합으로 메인 함수 이전과 이후의 처리가 필요한 경우 자유롭게 코드를 더 할 수 있게 된다.
'Study > iOS' 카테고리의 다른 글
iOS Hooking#2(Frida) (0) | 2017.04.19 |
---|---|
iOS Hooking#1(Logos) (1) | 2017.04.18 |
2장 iOS 해킹 기초 (1) (0) | 2016.06.18 |
자주쓰는 데이터형 변환 (0) | 2016.06.01 |
[iOS] MD5해시 생성 / SHA256해시 생성 (0) | 2016.05.09 |