[시스템] 라이브러리에 대하여
6. 라이브러리에 대하여
라이브러리란 시스템에서 프로그램을 직접 컴파일 할때 많은 프로그램에서 공통으
로 사용할수 있는 유용한 기능을 포함하고 있는 파일이다.
많은 프로그램들이 이런 라이브러리를 각 프로그램마다 포함하고 있지 않고 정보
만 가지고 있다 컴파일 당시 시스템 자체에 있는 라이브러리를 이용하여 컴파일이
되어지는 것이다.
어떤 경우에는 컴파일시 위와 같은 공유라이브러리를 이용하지 않고 자체적인 라이
브러리 루틴을 사용하기도 하는데 이런 프로그램을 정적으로 링크된(statically
linked) 프로그램이라고 하며 공유 라이브러리를 이용해 만들어진 것은 동적으로
링크된 프로그램이라고 한다.
동적으로 링크된 실행 파일은 공유라이브러리가 디스크에 존재하느냐에 의존한다.
이와 같은 방법으로 구현된 공유 라이브러리로 컴파일돈 프로그램은 일반적으로
현재 라이브러리의 버전에 의존하지 않는다. 즉 공유라이브러리를 업그레이드시
키면 프로그램 역시 업그레이드된 기능을 적용받게 되어져 있다.
단..라이브러리에 큰 변화가 있다면 오래된 프로그램은 새로운 라이브러리와 같
이 작동안할수도 있다. (glic-2.1.x 와 glibc-2.2.x 대에서의 문제와 같이..)
ldd 명령은 실행파일에 의존되는 라이브러리 목록을 보여주는 명령어 이다.
[root@zzang911 /root]# ldd /usr/bin/X11/xterm
libXft.so.1 => /usr/X11R6/lib/libXft.so.1 (0x4002d000)
libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x40052000)
libXrender.so.1 => /usr/X11R6/lib/libXrender.so.1 (0x40088000)
libXaw.so.7 => /usr/X11R6/lib/libXaw.so.7 (0x4008d000)
libXmu.so.6 => /usr/X11R6/lib/libXmu.so.6 (0x400e2000)
libXt.so.6 => /usr/X11R6/lib/libXt.so.6 (0x400f8000)
libSM.so.6 => /usr/X11R6/lib/libSM.so.6 (0x40145000)
libICE.so.6 => /usr/X11R6/lib/libICE.so.6 (0x4014f000)
libXpm.so.4 => /usr/X11R6/lib/libXpm.so.4 (0x40166000)
libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x40175000)
libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x40183000)
libncurses.so.5 => /usr/lib/libncurses.so.5 (0x40263000)
libutempter.so.0 => /usr/lib/libutempter.so.0 (0x402a5000)
libc.so.6 => /lib/i686/libc.so.6 (0x402a7000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
/etc/ld.so.conf 파일은 공유라이브러리 파일을 찾는 ld.so 에 대한 디렉토리
목록을 포함하고 있다.
[root@zzang911 /root]# cat /etc/ld.so.conf
/usr/local/lib
/usr/lib
/usr/kerberos/lib
/usr/X11R6/lib
ld.so.conf 에서 빠진 내용은 각 계정의 환경변수 설정에서 LD_LIBRARY_PATH에
검색경로로 디렉토리를 추가해 주면 된다. 환경변수 설정은 .bash_profile 나
.bashrc 에 추가해주면 된다.
아무튼 ld.so.conf에 새로운 항목을 추가 하였다면 다음명령어를 사용하여 적용
을 시켜 주어야 한다.
# ldconfig
이 명령어는 ld.so 의 검색 경로에서 공유 라이브러리 캐시를 재생성하게 된다.
이캐시 내용을 참조하여 보다 빨리 라이브러리를 찾기위해서 이다.
[ 라이브러리 업그레이드 하기 ]
먼저 /lib 디렉토리 내용을 보도록 하자.
-rwxr-xr-x 1 root root 1236396 4월 7 06:58 libc-2.2.2.so*
lrwxrwxrwx 1 root root 13 5월 5 04:23 libc.so.6 -> libc-2.2.2.so*
라이브러리를 업그레이드 할때는 라이브러리에 부합되는 .a 와 .so.version 파일
을 반드시 대체해야 한다.
.a 파일은 새로운 대체파일로 복사해 주면 되지만 공유라이브러리를 대체할때는
보다 주의를 요한다. .so.version 의 경우는 위에서 보는 바와 같이 libc.so.6 파일이
실제 파일인 libc-2.2.2.so* 에 링크되어져 있다. 새로 업그레이드 하여 libc-2.2.3.so
파일을 적용하기 위해서는 그냥 링크를 깨난던지 아님 파일 이름을 바꾼다던지 하면
시스템의 모든 명령어가 먹히지 않는 경우가 발생하게 된다. 그렇기 때문에 새로 업그레
이드 된 파일을 /lib 디렉토리에 옮겨놓고 ln -sf 명으로 링크의 연결을 새로운 파일이
있는곳으로 한번에 가도록 변경한다.
# ln -sf libc-2.2.3.so libc.so.6