웹사이트 검색

Linux의 공유 라이브러리 이해


프로그래밍에서 라이브러리는 프로그램에서 재사용할 수 있는 미리 컴파일된 코드 조각 모음입니다. 라이브러리는 프로그램에서 사용할 수 있는 재사용 가능한 함수, 루틴, 클래스, 데이터 구조 등(다른 프로그래머가 작성한)을 제공한다는 점에서 프로그래머의 삶을 단순화합니다.

예를 들어, 수학 연산을 수행해야 하는 애플리케이션을 구축하는 경우 이를 위한 새로운 수학 함수를 만들 필요가 없으며 해당 프로그래밍 언어용 라이브러리에 있는 기존 함수를 간단히 사용할 수 있습니다.

Linux 라이브러리의 예로는 libc(표준 C 라이브러리) 또는 Glibc(표준 C 라이브러리의 GNU 버전), libcurl(다중 프로토콜 파일)이 있습니다. 전송 라이브러리), libcrypt(C에서 암호화, 해싱 및 인코딩에 사용되는 라이브러리) 등이 있습니다.

Linux는 다음과 같은 두 가지 클래스의 라이브러리를 지원합니다.

  • 정적 라이브러리 – 컴파일 타임에 정적으로 프로그램에 바인딩됩니다.
  • 동적 또는 공유 라이브러리 – 프로그램이 시작될 때 로드되고 메모리에 로드되며 런타임 시 바인딩이 발생합니다.

동적 또는 공유 라이브러리는 다음과 같이 분류될 수 있습니다.

  • 동적으로 연결된 라이브러리 – 여기서 프로그램은 공유 라이브러리와 연결되고 커널은 실행 시 라이브러리를 로드합니다(메모리에 없는 경우).
  • 동적으로 로드된 라이브러리 – 프로그램은 라이브러리와 함께 함수를 호출하여 모든 권한을 갖습니다.

공유 라이브러리 명명 규칙

공유 라이브러리는 라이브러리 이름(a.k.a soname)과 "filename"(라이브러리 코드를 저장하는 파일의 절대 경로)이라는 두 가지 방식으로 이름이 지정됩니다.

예를 들어, libcsonamelibc.so.6입니다. 여기서 lib는 접두사이고 >c는 설명적인 이름이므로 공유 객체를 의미하고 6은 버전을 의미합니다. 파일 이름은 /lib64/libc.so.6입니다. soname은 실제로 파일 이름에 대한 심볼릭 링크입니다.

Linux에서 공유 라이브러리 찾기

공유 라이브러리는 ld.so(또는 ld.so.x) 및 ld-linux.so(또는 ld- linux.so.x) 프로그램. 여기서 x는 버전입니다. Linux에서는 /lib/ld-linux.so.x가 프로그램에서 사용하는 모든 공유 라이브러리를 검색하고 로드합니다.

프로그램은 라이브러리 이름이나 파일 이름을 사용하여 라이브러리를 호출할 수 있으며, 라이브러리 경로는 파일 시스템에서 라이브러리를 찾을 수 있는 디렉터리를 저장합니다. 기본적으로 라이브러리는 /usr/local/lib, /usr/local/lib64, /usr/lib에 있습니다. /usr/lib64; 시스템 시작 라이브러리는 /lib/lib64에 있습니다. 그러나 프로그래머는 사용자 정의 위치에 라이브러리를 설치할 수 있습니다.

라이브러리 경로는 명령줄 편집기로 편집할 수 있는 /etc/ld.so.conf 파일에서 정의할 수 있습니다.

vi /etc/ld.so.conf 

이 파일의 행은 커널이 /etc/ld.so.conf.d에 있는 파일을 로드하도록 지시합니다. 이런 방식으로 패키지 관리자나 프로그래머는 자신의 사용자 정의 라이브러리 디렉터리를 검색 목록에 추가할 수 있습니다.

/etc/ld.so.conf.d 디렉토리를 살펴보면 몇 가지 일반적인 패키지(kernel, mysql 및 postgresql)에 대한 .conf 파일을 볼 수 있습니다. 이 경우):

ls /etc/ld.so.conf.d

kernel-2.6.32-358.18.1.el6.x86_64.conf  kernel-2.6.32-696.1.1.el6.x86_64.conf  mariadb-x86_64.conf
kernel-2.6.32-642.6.2.el6.x86_64.conf   kernel-2.6.32-696.6.3.el6.x86_64.conf  postgresql-pgdg-libs.conf

mariadb-x86_64.conf를 살펴보면 패키지 라이브러리의 절대 경로를 볼 수 있습니다.

cat mariadb-x86_64.conf

/usr/lib64/mysql

위의 방법은 라이브러리 경로를 영구적으로 설정합니다. 임시로 설정하려면 명령줄에서 LD_LIBRARY_PATH 환경 변수를 사용하세요. 변경 사항을 영구적으로 유지하려면 셸 초기화 파일 /etc/profile(전역) 또는 ~/.profile(사용자별)에 이 줄을 추가하세요.

export LD_LIBRARY_PATH=/path/to/library/file

Linux에서 공유 라이브러리 관리

이제 공유 라이브러리를 처리하는 방법을 살펴보겠습니다. 바이너리 파일에 대한 모든 공유 라이브러리 종속성 목록을 얻으려면 ldd 유틸리티를 사용할 수 있습니다. ldd의 출력은 다음 형식입니다.

library name =>  filename (some hexadecimal value)
OR
filename (some hexadecimal value)  #this is shown when library name can’t be read

이 명령은 ls 명령에 대한 모든 공유 라이브러리 종속성을 표시합니다.

ldd /usr/bin/ls
OR
ldd /bin/ls
샘플 출력
	linux-vdso.so.1 =>  (0x00007ffebf9c2000)
	libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003b71e00000)
	librt.so.1 => /lib64/librt.so.1 (0x0000003b71600000)
	libcap.so.2 => /lib64/libcap.so.2 (0x0000003b76a00000)
	libacl.so.1 => /lib64/libacl.so.1 (0x0000003b75e00000)
	libc.so.6 => /lib64/libc.so.6 (0x0000003b70600000)
	libdl.so.2 => /lib64/libdl.so.2 (0x0000003b70a00000)
	/lib64/ld-linux-x86-64.so.2 (0x0000561abfc09000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003b70e00000)
	libattr.so.1 => /lib64/libattr.so.1 (0x0000003b75600000)

공유 라이브러리는 다양한 디렉토리에 존재할 수 있기 때문에 프로그램이 시작될 때 이러한 모든 디렉토리를 검색하는 것은 매우 비효율적입니다. 이는 동적 라이브러리의 단점 중 하나입니다. 따라서 ldconfig 프로그램에 의해 수행되는 캐싱 메커니즘이 사용됩니다.

기본적으로 ldconfig/etc/ld.so.conf의 내용을 읽고 동적 링크 디렉터리에 적절한 심볼릭 링크를 만든 다음 에 캐시를 씁니다. >/etc/ld.so.cache는 다른 프로그램에서 쉽게 사용할 수 있습니다.

이는 특히 새 공유 라이브러리를 설치했거나 자신만의 라이브러리를 만들었거나 새 라이브러리 디렉터리를 만든 경우 매우 중요합니다. 변경 사항을 적용하려면 ldconfig 명령을 실행해야 합니다.

ldconfig
OR
ldconfig -v 	#shows files and directories it works with

공유 라이브러리를 생성한 후에는 설치해야 합니다. 위에서 언급한 표준 디렉토리 중 하나로 이동하고 ldconfig 명령을 실행할 수 있습니다.

또는 다음 명령을 실행하여 soname에서 파일 이름으로의 심볼릭 링크를 만듭니다.

ldconfig -n /path/to/your/shared/libraries

자신만의 라이브러리 생성을 시작하려면 TLDP(Linux Documentation Project)에서 이 가이드를 확인하세요.

지금은 여기까지입니다! 이 기사에서는 라이브러리에 대한 소개와 공유 라이브러리, Linux에서 이를 관리하는 방법에 대해 설명했습니다. 공유하고 싶은 질문이나 추가 아이디어가 있으면 아래 의견 양식을 사용하세요.