2016년 9월 18일 일요일

attribute 함수 선언 - Declaring attributes of functions

얼마전 진행중인 프로젝트 코드에서 __attribute__ 로 선언된 함수에 관련된 문제가 발생하였다. 개괄적인 문제 내용은 해당 함수 선언으로 인해 실행 이미지 크기가 기존 대비 5M 증가하는 문제였다. (기존 이미지 크기 대비 50% 증가)
이 글에서는 프로젝트 문제 분석이 아닌 Attribute 함수에 대한 개괄적인 내용을 정리하겠다.

GNU 공식 site에서 소개하는 attribute 함수의 상세내역은 아래를 참조한다.
https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

해당 본문을 살펴보면 Attribute 함수는 일반적 동작 보다는 특별한 목적을 위해 사용하는 것임을 확인할 수 있다.
Attribute 함수는 사용하는 목적에 따라 다양한 매개변수를 취할 수 있다. 그 중에서 Application SW에서 사용빈도가 높은 매개변수는 constructor 정도가 아닐까한다. constructor 매개변수를 사용할 경우 아래의 설명에서 확인하듯이 main 함수 호출 이전에 해당 함수 호출이 가능하다. - destructor 매개변수 사용시 main 함수 완료 후 또는 exit 함수 호출 후 해당 함수가 호출된다.
이와는 별도로 static 객체의 경우도 main 함수 호출 이전에 해당 객체의 초기화가 이루어지기 때문에 __attribute__((constructor)) 선언된 함수와 비슷한 동작이 가능하다.
그렇다면 아래의 코드에서 먼저 호출되는 함수는 무엇일까 ?

#include <stdio.h> 

__attribute__((constructor)) static void _bar() { printf("bar\n"); }   // A ?

struct Foo { Foo() { printf("foo\n"); } };    // B ?
static Foo foo;


int main()   // C ? 
{
    printf("main\n");
    return 0;
}
수행 결과는 'B'->'A'->'C'의 순서로 함수 호출이 이루어짐을 확인하였다. 이와 관련된 글을 찾아보니 __attribute__((constructor))로 선언된 함수는 Standard C++가 아닌 GCC extension 기능 중 하나이고
GCC 구현사항에 의존한다고 한다.
http://stackoverflow.com/questions/8433484/c-static-initialization-vs-attribute-constructor

댓글 없음:

댓글 쓰기