본문 바로가기
스터디/system

[리눅스갤] 공유(동적)라이브러리 와 정적라이브러리

by 깝태 2011. 3. 20.


출처 - http://blog.naver.com/ddrkcodz/10069875361






----------------------------------------------------------------------

공유(동적)라이브러리와 정적라이브러리 (Dynamic Linked Library and Static Linked Library) 

공유 라이브러리(Dynamic Linked Library)

정확히 동적 연동 라이브러리라고 하지만,
라이브러리를 하나의 메모리 공간에 맵핑한 후,
여러 프로그램에서 공유하여 활용하므로 공유라이브러리 라 하기도 한다.
그만큼 메모리, 용량 절약 차원의 장점이 있으며
라이브러리 업데이트 등의 유연성을 가지고 있다.
하지만, 라이브러리 의존성에 따른 관리가 필요하다.

[ddrkcodz@localhost ~]$ vi libhello.c 



이파일을 공유 라이브러리로 만들면, 아래와 같다.

[ddrkcodz@localhost ~]$ gcc -fPIC -c libhello.c
[ddrkcodz@localhost ~]$ gcc -shared -fPIC -o libhello.so libhello.o

실행결과는 libhello.so 파일이 생성되어 있으며 위의 컴파일 명령어를 잠시 보면,
컴파일된 libhello.o 파일을 libhello.so 파일로 아래 옵션들을 붙여 묶는다.
'-fPIC'      는 Position-Independent Code의 약자 이며, 대,소문자에 따라 약간의 차이가 있다
       '-fPIC' 의 경우 크고 느리지만 플랫폼에 무관한 확실한 코드를 생성하고
       '-fpic'  의 경우 작고 빠르지만 경우에 따라서 플랫폼에 따라 제약이 생기는 코드를 생성
'-shared'  는 공유 라이브러리 생성 옵션. 

제대로 생성되었는지 확인해보면,

[ddrkcodz@localhost ~]$ file libhello.so
libhello.so: ELF 32-bit LSB shared object, intel 80386, version 1 (SYSV), dynamically linked, not stripped

위 공유 라이브러리를 이용해서 파일을 생성해보면,

[ddrkcodz@localhost ~]$ vi main.c

 

[ddrkcodz@localhost ~]$ gcc -o main main.c -L, -lhello

프로그램 실행 시, 라이브러리 파일을 찾을 수 없다고 안되는 경우,
해당 라이브러리 파일을 설치해 주면 됩니다.
/usr/lib 폴더에 라이브러리 파일을 복사 한 후,
ldconfig 명령어로 재갱신한다. 

혹은

[ddrkcodz@localhost ~]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$pwd

 

정적 라이브러리(Static Linked Library) 

정적 라이브러리는 파일 생성시, 라이브러리 내용을 포함한다.
따라서, 공유 라이브러리와 같이 라이브러리 연동 과정이 따로 필요 없지만
파일 크기가 커지며 라이브러리 활용성에 있어서 다른 프로그램들과 공유하지 않기 때문에
해당 라이브러리를 활용하는 프로그램들 모두 라이브러리 내용을 메모리에 맵핑 시켜
메모리 활용성에 있어서 좋은 방법은 아니다.
하지만, 한번 생성한 파일에 대해서는 라이브러리를 따로 관리하지 않아서 편하다. 

libhello.c를 재사용하여,

[ddrkcodz@localhost ~]$ gcc -c libhello.c

다음으로, 아카이브(archive) 파일로 생성해 준다.
원래 보통 여러 목적파일들을 하나로 묶어서 라이브러리 파일로 생성하기 때문에,
과정을 거치지만, 이 예저에서는 목적파일이 하나 밖에 없으니 그리 필요성은 없다.

[ddrkcodz@localhost ~]$ ar crv libhello.a libhello.o

마지막으로 프로그램을 생성한다.

[ddrkcodz@localhost ~]$ gcc -o main main.c -L -lhello

참고로 공유 라이브러리와 정적 라이브러리가 함께 있을 때는
동적 라이브러리가 우선 순위를 가지므로,
명시적으로 정적 라이브러리를 이용하겠다고 명령어를 줄 수 있다.

[ddrkcodz@localhost ~]$ gcc -static -o main main.c -L, -lhello