linux 에서 program 을 실행할 때 다음과 같이 "cannot open shared object file: No such file or directory" 에러가 나는 경우가 있습니다.


$ openssl

openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
BASH


이런 문제는 다음 절차를 통해 문제를 해결할 수 있습니다.

ldd 로 필요 library 확인하기

공유 라이브러리 의존성을 출력하는 ldd 로 프로그램 실행에 필요한 라이브러리를 확인합니다.

$ ldd `which openssl`
        linux-vdso.so.1 (0x00007ffcc7df1000)
        libssl.so.1.1 => not found
        libcrypto.so.1.1 => not found
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f3f51b7a000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f3f5195c000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f3f515b1000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f3f51d7e000)
BASH

결과를 보면 libssl.so.1.1libcrypto.so.1.1 이 "not found" 인 것을 확인할 수 있고 이 2개 파일을 못찾아서 문제가 발생한 것을 유추할수 있습니다.

처리

"not found" 지만 실제 원인은 2가지입니다.

이런 현상은 다음과 같은 원인때문에 발생합니다.

  1. 실행에 필요한 library 가 없음 → find 명령어로 시스템에서 library 를 찾고 있으면 아래에서 설명하는 환경 변수에 경로를 추가합니다. 
  2. 실행에 필요한 library 가 환경 변수에 없음

LD_LIBRARY_PATH 환경 변수 확인

리눅스에서 실행에 필요한 공유 라이브러리는 LD_LIBRARY_PATH 환경 변수에서 찾게 됩니다. 대부분의 공유 라이브러리를 못 찾는다는 에러의 원인은 바로 LD_LIBRARY_PATH 변수가 잘못 설정되어서입니다.

특히 third party program의 경우 /opt 나  /usr/local 같이 별도의 경로에 설치되는 경우가 많으므로 이런 에러가 발생하게 됩니다.


먼저 환경 변수를 확인하려면 다음 명령을 실행합니다.

$ echo $LD_LIBRARY_PATH
BASH


LD_LIBRARY_PATH 환경 변수 경로내에 라이브러리 파일(Ex: libssl.so.1.1) 이 있는지 확인하려면 다음 스크립트를 실행합니다.

IFS=':' ; for i in $LD_LIBRARY_PATH; do ls -l $i/libssl.so.1.1 2>/dev/null;done
BASH


위 코드 실행시 결과가 나오지 않는다면 LD_LIBRARY_PATH 가 제대로 설정되지 않은 것입니다.


라이브러리가 있는 경로를 확인한 후에 LD_LIBRARY_PATH에 해당 경로가 없다면 다음과 같이 설정합니다. 다음은 compile 해서 프로그램 설치시 많이 사용되는 /usr/local/lib64 를 추가하는 예제입니다. 

export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
BASH


이제 다시 ldd 를 실행해서 정상적으로 라이브러리를 찾는 지 확인해 보면 됩니다.

이제 로그인시에도 문제없도록 export LD_LIBRARY_PATH 구문을 shell 초기화 파일에 추가하면 됩니다.

같이 보기