리눅스

__attribute__ ((visibility("default"))) 관련

개발새발 2020. 9. 13. 19:34
반응형

외부에 제공하는 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;

117

118         CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);

119

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         }

124

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         }

129

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         }

138

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         }

144

145         _wifi_add_to_handle_list(wifi);

146         WIFI_LOG(WIFI_INFO, "Wi-Fi successfully initialized");

147

148         return WIFI_MANAGER_ERROR_NONE;

149 }

 

 

__attribute__ ((visibility("default"))) 의 기능을 검색해보니 다음과 같은 기능들을 제공한다.

 

  1. 공유 라이브러리와 같은 DSO(Dynamic Shared Object, 동적 공유 객체)를 로드하는데 걸리는 시간을 획기적으로 향상시켜준다.
  2. 컴파일러 최적화기(optimiser)가 더 좋은 코드를 만들수 있다.
  3. DSO 크기를 5~20% 정도 줄여준다.
  4. 심볼(symbol)이 충돌할 기회를 낮춰준다.

+ gcc 컴파일 옵션에 -fvisibility=hidden 인수를 추가

 

결론적으로 FW에서 제공하는 API 함수를 빠르게 로드하고 최적화 하기위해 사용된다.

 

 

참고 lethean.github.io/2006/01/31/gcc-symbol-visibility-patch/

반응형