linux 에서 라이브러리를 찾을 수 없다며 프로그램 실행이 안 될때 해결방법(error while loading shared libraries)
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
이런 문제는 다음 절차를 통해 문제를 해결할 수 있습니다.
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)
결과를 보면 libssl.so.1.1 과 libcrypto.so.1.1 이 "not found" 인 것을 확인할 수 있고 이 2개 파일을 못찾아서 문제가 발생한 것을 유추할수 있습니다.
처리
"not found" 지만 실제 원인은 2가지입니다.
이런 현상은 다음과 같은 원인때문에 발생합니다.
- 실행에 필요한 library 가 없음 → find 명령어로 시스템에서 library 를 찾고 있으면 아래에서 설명하는 환경 변수에 경로를 추가합니다.
- 실행에 필요한 library 가 환경 변수에 없음
LD_LIBRARY_PATH 환경 변수 확인
리눅스에서 실행에 필요한 공유 라이브러리는 LD_LIBRARY_PATH 환경 변수에서 찾게 됩니다. 대부분의 공유 라이브러리를 못 찾는다는 에러의 원인은 바로 LD_LIBRARY_PATH 변수가 잘못 설정되어서입니다.
특히 third party program의 경우 /opt 나 /usr/local 같이 별도의 경로에 설치되는 경우가 많으므로 이런 에러가 발생하게 됩니다.
먼저 환경 변수를 확인하려면 다음 명령을 실행합니다.
$ echo $LD_LIBRARY_PATH
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
위 코드 실행시 결과가 나오지 않는다면 LD_LIBRARY_PATH 가 제대로 설정되지 않은 것입니다.
라이브러리가 있는 경로를 확인한 후에 LD_LIBRARY_PATH에 해당 경로가 없다면 다음과 같이 설정합니다. 다음은 compile 해서 프로그램 설치시 많이 사용되는 /usr/local/lib64 를 추가하는 예제입니다.
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
이제 다시 ldd 를 실행해서 정상적으로 라이브러리를 찾는 지 확인해 보면 됩니다.
이제 로그인시에도 문제없도록 export LD_LIBRARY_PATH 구문을 shell 초기화 파일에 추가하면 됩니다.