본문 바로가기

컴퓨터/기타

Static/Shared 라이브러리 빌드시 hidden symbol 처리

static 라이브러리를 shared 라이브러리에 포함할 때 

static 라이브러리의 심볼이 외부에 노출되지 않도록 hidden symbol 작업이 필요하다.


<필요한 작업>

1. static library 빌드하는 쪽 - hidden symbol 작업

2. shared library 빌드하는 쪽 - hidden symbol 작업, export symbol 작업


* static library 빌드하는 쪽 - hidden symbol 작업 (컴파일 옵션 추가)

 HP-UX 32비트

  export CFLAGS='-Bhidden -D_REENTRANT’

 HP-UX IA64 64비트 

  export CFLAGS=’-Bhidden -D_REENTRANT’

 SUNOS 32/64비트

 export CFLAGS=-fPIC


* shared library 빌드하는 쪽 - hidden symbol 작업, export symbol 작업 (링크 옵션 추가)

** hidden symbol 작업

 Linux

  LDFLAGS += -Wl,–exclude-libs=ALL <- static library의 모든 심볼 hide해줌

 SunOS
  LDFLAGS += -Wl,-M,expsymbols.sym <- expsymbols.sym 내용에 따라 심볼 hide 여부 결정

 HP-PA 64비트
  LDFLAGS += +hideallsymbols +linkersyms <- 모든 심볼 hide, expsymbols_pa64.sym 내용에 따라 심볼 hide 여부 결정

 <cmake 사용시에 add_library에 MODULE 로 설정이 되어있다면 SHARED 로 변경>

** export symbol 작업 - shared library에서 노출시킬 symbol 리스트 만들기

 SunOS

  expsymbols.sym 내용 예제

  {

    global:

test_function;

test_function2;   <- 노출심볼

local:*;             <- 모든 심볼 hide

  }

 HP-PA 64비트

  expsymbols_pa64.sym 내용 예제

  set(CMAKE_SHARED_LINKER_FLAGS"${CMAKE_SHARED_LINKER_FLAGS}

  -Wl,+hideallsymbols,+linkersyms,\

  +e,test_function,\

  +e,test_function2\

  ")



* 주의사항

** HP-IA 64비트 shared library 빌드시 static library를 링크할 때 순서에 민감하게 반응한다.

  shared library를 링크할 때에는 -L {위치} -l {라이브러리 이름} 으로 링크했었는데, static library 링크시에는 컴파일하는 파일들을 나열할 때 함께 써준다.

<shared library 링크할 때>

cc -o test.so +DD64 -b -D_REENTRANT -L../test/test2  -ltest \

  -lpthread \

  test1.c test2.c test3.c

<static library 링크할 때>

cc -o test.so +DD64 -b -D_REENTRANT  \

  -lpthread \

  test1.c test2.c test3.c \

  ../test/test2/test.a




끝!