2017-09-23 14 views
1

공유 라이브러리를 작성할 때 일반적으로 링커 스크립트 또는 -fvisibility 옵션을 사용하여 동적 연결 시간을 줄이기 위해 모든 내부 기호를 숨기는 것이 좋습니다. 의 정적 라이브러리를 공유 라이브러리에 링크 할 때 심볼을 숨겨야합니까?

  • 타사 정적 라이브러리 (예를 들어, libuv)
  • 모든

    • 내부 정적 라이브러리 :

      내 경우

      , 공유 라이브러리는 두 개의 다른 라이브러리의 종류와 연결되어 그것들은 -Wl,--whole-archive 옵션을 사용하여 공유 라이브러리에 링크되므로 결과 공유 라이브러리는 자급 자족하며 stdlib에만 링크됩니다.

      내부 정적 라이브러리의 모든 기호는 공개 API의 일부가 아니기 때문에 숨겨져 있습니다.

      제 3 자 정적 라이브러리의 기호를 숨기는 이유는 무엇입니까? 모범 사례와 알려진 함정이 있습니까? 한편으로는 내 라이브러리의 공개 API에 포함되지 않습니다. 다른 한편으로는 제 3 자 라이브러리에 대한 공개 API의 일부입니다.

      사용자가 동일한 타사 라이브러리의 다른 버전에 연결할 때 문제가 발생할 것으로 생각됩니다. 이론적으로 기호를 숨기면 문제를 해결할 수 있지만 실제로는 예기치 않은 문제가 발생할 수 있습니다.

    답변

    1

    내 의견으로는 API에 포함되지 않은 모든 기호를 숨겨야합니다. 타사 정적 라이브러리 심볼을 숨겨진 라이브러리 심볼로 변환하려면 옵션 --exclude-libs,ALL이 필요합니다. 나는 해결책의 단점을 알지 못한다. 동적 링커의 속도를 높이고, 또 다른 라이브러리 버전과의 정적 링크를위한 단점을 보지 못한다. 정적 링크가 동적 연결 (핫 스와핑 또는 그렇게)이 아니기 때문이다.