본문 바로가기

서버 관리/리눅스

리눅스 공유 라이브러리에 관하여

[1. 개요]

.so 파일을 참조하는 application (c++ 으로 작성 된 혹은...) 은 런타임 시,

필요한 공유 라이브러리를 로드하여 사용하는데,  이 때, 시스템 상 미리 정의 된 위치에서 필요한 라이브러리를 찾는다.

 

아래와 같은 명령어를 통해, 사용하고자 하는 app 이 참조하는 라이브러리 목록을 확인 할 수 있다.

  • $ ldd $(which curl) 

문제는, 필요한 라이브러리를 찾지 못하는 경우, app 실행이 되지 않는 것이며,

여기서는 이러한 문제를 해결하기 위하여 해야 할 조치를 정리한다.


[2. 기본적으로 찾는 경로]

가장 단순한 방법은 시스템이 기본적으로 찾는 위치에 사용 할 라이브러리를 위치시키는 것이다.

 

32bit 프로그램은 아래와 같고

  • /lib
  • /usr/lib
  • /usr/local/lib

64bit 프로그램은 아래와 같다.

  • /lib64
  • /usr/lib64
  • /usr/local/lib64

[3. ldconfig 활용]

/etc 디렉터리를 살펴보면 아래와 같은 디렉터리가 있다.

  • /etc/ld.so.conf.d
  • 이 디렉터리 안에는 *.conf 형태의 파일이 존재하며,
  • 해당 파일에는 .so 파일이 위치한 파일 경로가 명시 되어 있다.

즉, /etc/ld.so.conf.d 에 .conf 을 생성하고, 해당 파일에 참조할 라이브러리 경로(디렉터리 까지만) 을 명시하고,

ldconfig 명령어를 통해 update 하면 된다. (시스템에 반영한다는 의미이다.)


[4. LD_LIBRARY_PATH]

현재 세션에서만, 유효하게 할 것이라면, LD_LIBRARY_PATH 라는 환경 변수를 설정하는 것도 한가지 방법이다.

  • export LD_LIBRARY_PATH=$(pwd):$LD_LIBRARY_PATH

다만, 우려할 부분이 있다면 동일한 이름의 라이브러리가 있을 때, 충돌이 발생 할 수 있다.

예를들면, 

  • curl 이 libssl.so.2 를 참조하는데, 이 라이브러리는 기본적으로 /lib64 에 있다고 하자.
  • /root/libssl.so.2 라는 라이브러리를 별도 생성한 app 이 참조하여,
    LD_LIBRARY_PATH 를 이용하여 /root 에서 libssl.so.2 를 찾도록한다.
  • 별도 생성한 app 은 정상 실행 할 수 있으나,
  • 기존 curl 은 경우에 따라 libssl.so.2 를 사용하지 못해 실행 실패가 발생 할 수 있다.
    # 더 정확히 말하자면, cur 이 A 라는 기능 사용이 필요하고,
    # /lib64/libssl.so.2 에 있는 라이브러리에는 이 기능이 있음.
    # 그러나 /root/libssl.so.2 에 있는 라이브러리에는 이 기능이 없음..
  • 혹은, libmytest.so 라는 공유라이브러리도 어떤 공유라이브러리를 참조 할 수 있는 경우,
    이 어떤 공유라이브러리를 환경 변수에 의해 설정 된 경로에서 가져올 수 있다. (이름이 겹친다면,)

lsof: symbol lookup error: /lib64/libk5crypto.so.3: undefined symbol: EVP_KDF_ctrl, version OPENSSL_1_1_1b

'서버 관리 > 리눅스' 카테고리의 다른 글

리눅스 패키지 관리  (0) 2025.05.01
samba 서버 설치  (0) 2025.05.01
리눅스. 스택 크기에 관한 고찰  (0) 2025.03.26
multibyte string to widechar string  (0) 2025.01.22
file 명령어  (0) 2025.01.21