외부에 제공하는 API의 함수 정의 부분에 아래와 같이 EXPORT_API라는 부분이 있어서 메크로를 타고타고 들어가보니
아래와 같이 선언되어 있었고 실제로는 __attribute__ ((visibility("default"))) 라는 키워드가 있었다.
#define EXPORT_API __attribute__ ((visibility("default")))
/*Tizen wifi-manager중 일부*/
EXPORT_API int wifi_manager_initialize(wifi_manager_h *wifi)
115 {
116 int rv;
118 CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
120 if (wifi == NULL) {
121 WIFI_LOG(WIFI_ERROR, "Invalid parameter"); //LCOV_EXCL_LINE
122 return WIFI_MANAGER_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
123 }
125 if (__wifi_check_handle_validity(*wifi)) {
126 WIFI_LOG(WIFI_ERROR, "Already initialized"); //LCOV_EXCL_LINE
127 return WIFI_MANAGER_ERROR_ALREADY_INITIALIZED; //LCOV_EXCL_LINE
128 }
130 rv = _wifi_init();
131 if (rv == NET_ERR_ACCESS_DENIED) {
132 WIFI_LOG(WIFI_ERROR, "Access denied"); //LCOV_EXCL_LINE
133 return WIFI_MANAGER_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
134 } else if (rv != NET_ERR_NONE) {
135 WIFI_LOG(WIFI_ERROR, "Init failed[%d]", rv); //LCOV_EXCL_LINE
136 return WIFI_MANAGER_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
137 }
139 rv = _wifi_create_handle(wifi);
140 if (rv != WIFI_MANAGER_ERROR_NONE) {
141 WIFI_LOG(WIFI_ERROR, "Init failed[%d]", rv); //LCOV_EXCL_LINE
142 return WIFI_MANAGER_ERROR_OUT_OF_MEMORY; //LCOV_EXCL_LINE
143 }
145 _wifi_add_to_handle_list(wifi);
146 WIFI_LOG(WIFI_INFO, "Wi-Fi successfully initialized");
148 return WIFI_MANAGER_ERROR_NONE;
149 }
__attribute__ ((visibility("default"))) 의 기능을 검색해보니 다음과 같은 기능들을 제공한다.
- 공유 라이브러리와 같은 DSO(Dynamic Shared Object, 동적 공유 객체)를 로드하는데 걸리는 시간을 획기적으로 향상시켜준다.
- 컴파일러 최적화기(optimiser)가 더 좋은 코드를 만들수 있다.
- DSO 크기를 5~20% 정도 줄여준다.
- 심볼(symbol)이 충돌할 기회를 낮춰준다.
+ gcc 컴파일 옵션에 -fvisibility=hidden 인수를 추가
결론적으로 FW에서 제공하는 API 함수를 빠르게 로드하고 최적화 하기위해 사용된다.
참고 lethean.github.io/2006/01/31/gcc-symbol-visibility-patch/
'리눅스' 카테고리의 다른 글
Unix Domain Socket (0) | 2020.04.12 |
---|---|
[Linux] Daemon Process란? (0) | 2018.03.25 |
[glib] 메인루프 (0) | 2018.03.04 |
리눅스 signal (0) | 2018.02.17 |
pthread에서 메모리 침범과 pthread_cancel (1) | 2018.01.21 |