개인/리눅스

[리눅스] 공유 라이브러리 확인방법 (ldd)

OmeGa2 2020. 2. 13. 18:44

리눅스에서 라이브러리란?

라이브러리는 사전적인 의미로는 도서관을 뜻한다. 도서관에서는 여러 사용자가 공용으로 책을 이용할 수 있는 것처럼 리눅스에서의 라이브러리 또한 여러 사람이 이용할 수 있는 프로그램을 말한다.

 

컴퓨터 프로그램은 대부분 기본적인 명령어나 함수는 동일한 경우가 많다.

프로그램에 들어가는 동일한 기능은 여러 프로그램을 작성할 때 반복적으로 작성해야 하는 경우가 많고 이는 많은 시간이 들어가 비효율적인 구조를 가진다.

 

라이브러리는 이러한 불필요한 반복작업을 하지 않기 위해 기본적인 코드를 작성한 파일을 따로 만들어 두고 재사용이 가능한 형태로 만든 것이다.

 

라이브러리는 프로그램을 개발할 때 사용자의 프로그램과 링크되어 실행가능한 형태가 된다.

이 때, 링크 방식에 따라 정적 라이브러리와 동적 라이브러리 두 가지로 나뉜다.

 

 

동적 라이브러리

프로그램과 링크 방식에 따라 나뉘는 동적, 정적 라이브러리 두 가지 형태는 사용하는 방식이 다르다.

 

정적 라이브러리의 경우 프로그램을 컴파일할 때 실행파일에 포함되어 배포된다.

덕분에 속도가 빠르다는 장점을 가지고 있지만, 실행파일의 크기가 커지고 메모리를 상당히 차지하게 된다.

 

반면 동적 라이브러리는 실행 프로그램에서 필요할 때만 라이브러리를 메모리에 올린다.

여러 명령어에서 사용되는 동일한 부분을 특정 디렉터리를 만들어 모아놓고 명령어와 링크를 걸어둔다. 이후 명령어를 사용하면 디렉터리(공유 라이브러리)에 있는 파일을 가져와 메모리에 올려 사용하는 것이다.

 

따라서 정적 라이브러리 보다는 디스크의 공간을 절약하며 효율적으로 사용할 수 있게 된다.

이러한 점 때문에 운영체제에서는 동적 공유 라이브러리를 주로 사용한다.

 

 

동적 공유 라이브러리

리눅스에서는 많은 명령어와 프로그램이 동적 공유 라이브러리를 이용한다.

리눅스에서 ls, cd, gcc컴파일러, yum 등 여러 명령어중에는 공통적으로 실행되어야하는 부분이 몇가지 존재한다. 이런 프로그램들의 공통적인 부분들을 한 디렉터리에 모아 동적 공유 라이브러리라고 부른다.

 

이후 관련된 프로그램이나 명령어를 실행했을 때 동적 공유 라이브러리 안에 파일이 링크가 되어 같이 실행된다.  따라서 동적 공유 라이브러리를 사용하면 실행파일이나 프로그램의 크기를 작게 만들어 사용할 수 있게 된다.

 

관련 디렉토리로는 /lib64 와 /usr/lib 등이 있으며 대표적인 특징이 두 가지 있다.

 

 

1. 의존성

 

동적으로 링크된 프로그램은 적어도하나 이상의 공유 라이브러리가 필요하다. 만일 프로그램을 실행할 때 필요한 라이브러리를 찾지 못하면 프로그램이 실행되지 않는다.

ex) GNOME 그래픽 환경에서 동작하는 응용 프로그램을 실행하려고 할 때 관련된 라이브러리인 GTK+가 설치되어 있지 않으면 실행되지 않는다.

 

 

2. 링크

 

동적 링크가 이루어진 실행파일과 공유 라이브러리의 파일은 ld.so 에 의해 검사된다. 

ld.so 는 링커 역할을 하면서  실행파일을 점검하기도 하는데, 만약 ld.so 가 링크된 라이브러리를 찾지 못하면 파일을 실행할 수 없다.

 

 

 

동적 공유 라이브러리 관련 디렉터리

리눅스 운영체제에서 사용되는 공유 라이브러리는 공유물(shared object) 라는 의미로 파일명 뒤에 .so 가 붙는다.

 

공유 라이브러리 파일들의 위치는 대부분 /lib64 와 /usr/lib 에 나뉘어져 있다.

/lib, /lib64 = cp나 mv 등과 같은 기본 명령어 및 시스템과 연관된 라이브러리

/usr/lib = 응용 프로그램과 관련된 라이브러리

 

실제 ldd 명령을 통해 rm 명령에서 사용되는 공유 라이브러리를 확인한 뒤,

/lib64 디렉터리에 가보니 rm 에서 사용되는 파일을 볼 수 있다.  

 

 

또한 /lib64, /usr/lib 이외에 다른 디렉터리를 공유 라이브러리로 등록하기 위해서는

주로 ld.so.conf 나 ld.so.cache 파일을 사용한다.

/etc/ld.so.conf = 다른 디렉터리를 공유라이브러리로 등록

/etc/ld.so.cache = 라이브러리 파일 목록정보

ld.so.conf 파일은 기본적인 공유 라이브러리를 제외한 다른 디렉터리를 추가적으로 만들어 공유 라이브러리로 등록하기 위해 사용하는 환경설정 파일이다.

 

추가로 파일을 등록할 때는 한 줄에 하나씩 작성해서 ldconfig 명령으로 정보를 갱신해야 한다.

 

ld.so.cache 파일은 /lib, /usr/lib 파일이나 환경설정(ld.so.conf)파일에

등록된 라이브러리 파일 목록정보를 가지고 있다.

 

 

 

 

공유 라이브러리 관련 명령어

1. ldconfig

]# ldconfig [라이브러리]

-p : 현재 캐시에 저장된 라이브러리목록 출력

-f : 기본파일(ld.so.conf) 이외에 다른 환경설정파일 지정

기본적으로 공유 라이브러리로 설정된 /etc/ld.so.conf 파일을 수정 후 갱신할 때 사용된다.

다른옵션 없이 ldconfig 명령만 입력해도 내용이 갱신된다.

 

만일 다른 라이브러리를 공유로 지정하고 싶을 때는 /etc/ld.so.conf 파일을 먼저 수정하고,

ldconfig 명령을 통해 읽어들여 갱신되어야 정상적으로 이용할 수 있다.

 

 

 

2. ldd

]# ldd [파일명] 

-v : 자세히 출력

-f : 기본파일(ld.so.conf) 이외에 다른 환경설정파일 지정

특정 파일이나 프로그램에 링크되거나 의존하고 있는 공유 라이브러리

정보를 확인할 수 있는 명령이다.

 

ldd를 사용할 때는 일반적인 명령어를 그대로 쓰면 제대로 출력되지 않는다.

명령어를 사용할 때는 환경변수에 의해 인식되서 어디에서든지 사용할 수 있다.

 

하지만 ldd를 통해 관련 라이브러리를 확인하고 싶을 때는  

해당 명령어나 파일이 위치한 경로를 정확하게 입력해야 한다.

(ldd mkdir = X) / (ldd /bin/mkdir = O)

 

 

리눅스의 기본 명령어인 mkdir 과 rm 명령의 공유 라이브러리를 확인해보았다.

mkdir에서는 총 5개, rm에서는 총 3개의 공유 라이브러리를 사용한다.

 

이 때 대부분의 라이브러리가 겹친다는 것을 확인할 수 있다.

만약 명령어마다 이렇게 겹치는 라이브러리를 각자 가지게 된다면 그것만해도

디스크의 용량을 상당히 차지할 것이다.