공유 라이브러리 란

printf 같이 프로그램마다 자주 사용하는 외부 함수를 실행 프로그램에 포함시킬 경우  프로그램의 덩치가 커지고 외부 라이브러리가 업그레이드 됐을 경우 이를 사용하는 프로그램을 다시 컴파일해야 하는 부담이 있습니다.

실행 프로그램에 외부 함수를 같이 포함시키는 것을 정적 링크(static linking) 라고 부릅니다.)

이런 문제를 해결하기 위해 프로그램에 직접 외부 함수를 포함시키지 않고 연결만 해 놓은 후에 실행 시점(run-time)에 외부 라이브러리에서 로딩하는 방식을 사용하는 것을 공유 라이브러리(shared library)라고 합니다.

windows 에서는 공유 라이브러리대신 DLL(Dynamic Link Library) 이라고 부릅니다.

이렇게 하면 실행 파일의 용량이 작아지고 같은 라이브러리를 쓰는 여러 프로그램이 있을 경우 라이브러리가 바뀌면 프로그램을 재컴파일하지 않아도 되는 장점이 있습니다.

물론 라이브러리의 ABI(application binary interface) 는 호환성을 가져야 합니다.

하드 디스크등 자원이 넉넉한 지금 환경에서는 공유 라이브러리가 단점인 상황도 많습니다. 특히 공유 라이브러리를 잘못 사용하면 DLL Hell 이라 불리우는 골치 아픈 라이브러리 관리 문제가 있으며 app 을 외부에 배포할 때도 라이브러리를 포함해야 하므로 까다롭습니다.

이때문에 go lang 이나 rust 같은 컴파일 언어는 공유 라이브러리를 사용하지 않고 하나의 app 안에 외부 함수를 모두 포함하므로 실행 파일 하나만 있어도 되는 장점이 있습니다.



어떤 프로그램이 공유 라이브러리를 사용하는지 알아보려면 리눅스에는
file 명령어를 사용하면 되며 아래는 공유 라이브러리를 사용했을 때 결과입니다.

$ file a.out

a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
BASH



정적 링크된 프로그램은 아래와 같이 표시합니다.

$ file a.out

a.out: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.18, not stripped

CODE


사용법

ldd 는 프로그램을 실행하는데 필요한 공유 라이브러리 의존성을 출력해 주는 유틸리티입니다.


사용법은 ldd 뒤에 의존성을 알고 싶은 프로그램의 절대 경로를 입력해 주면 되며 다음은 openssl 명령어 실행에 필요한 라이브러리 목록을 표시합니다.

$ ldd `which openssl`

        linux-vdso.so.1 (0x00007ffdef5e6000)
        libssl.so.1.1 => /usr/lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007fc7e741c000)
        libcrypto.so.1.1 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 (0x00007fc7e6f51000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc7e6d32000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc7e6941000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fc7e673d000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fc7e795c000)
BASH

좌측에 있는 항목(예: libcrypto.so.1.1) 이 의존하는 라이브러리 이름이며 우측에 있는 항목이 로딩할 실제 라이브러리(예: /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1) 입니다.


라이브러리가 없다면 우측 항목에는 대신 "not found" 라는 문구가 표시되며 해결을 하려면 linux 에서 라이브러리를 찾을 수 없다며 프로그램 실행이 안 될때 해결방법 를 참고하세요.


같이 보기