shared library를 어떻게 찾는가

Posted on July 12, 2016 by 주형

Shared Library란

static library와 대응되는 말. static library는 링크할 때 라이브러리가 같이 포함된다. shared library는 링크할 때 포함되지 않고 실행할 때 라이브러리를 불러온다.

왜 Shared Library를 쓰는가

Shared Library의 일반적인 사용법

/lib 이나 /usr/local/lib이나 /usr/lib 같은 곳에 라이브러리를 설치한다. shared library를 필요로하는 프로그램을 실행시킬 때 이 표준 라이브러리에서 사용한다.

문제가 생기는 지점

문제 해결하기

LD_LIBRARY_PATH

환경변수 LD_LIBRARY_PATH 를 사용하면 표준적인 위치에서 찾기 전에 shared library를 탐색할 위치를 지정할 수 있다.

Linux’s RPATH

Linux에서 RPATH를 이용하면 링크 타임에 라이브러리 로드 패쓰를 상대 위치로 지정할 수 있다.

OS X’s @rpath

OS X 에서는 shared library의 install name에 @rpath를 사용하는 걸 권장한다. install name에 @rpath가 들어있으면 그 라이브러리를 사용하는 실행파일 혹은 라이브러리의 헤더에 적혀있는 rpath를 사용하여 shared library를 찾을 수 있다. rpath는 라이브러리를 링크할 때 설정할 수 있다. 혹은 빌드가 끝난 결과물의 rpath를 설정할 수 있다.

otool -l (빌드된 파일) 을 사용하면 rpath가 어떻게 설정되어있는 지 볼 수 있다.

otool -l output 예시. rpath가 상대좌표 lib으로 세팅되어있으면 다음과 같은 결과를 볼 수 있다.

Load command 16
          cmd LC_RPATH
      cmdsize 16
         path lib (offset 12)

install_name_tool -add_rpath (rpath_directory) (binary) 를 사용하면 바이너리 파일에 rpath를 추가할 수 있다.

Reference