두근두근이야기

동적(공유) 라이브러리와 정적 라이브러리 본문

IT/IT ::Linux

동적(공유) 라이브러리와 정적 라이브러리

골든 2013. 8. 9. 11:51


정적라이브러리

- 동적(공유)라이브러리에 비해 실행 속도가 빠르고 배포에 제약이 없음

- 다만, 해당 라이브러리를 필요로 하는 모든 경우 같은 정적 라이브러리가 링크되기 때문에 배포 파일들의 사이즈가 커짐

- 그러므로 하드디스크 공간도 더 차지하고 메모리도 더 많이 차지함

- 그러나 유닉스 시스템의 경우 그때그때 필요한 부분만 메모리에 로딩하는 demand paging을 사용하기 때문에 정적인 라이브러리의 메모리 사용률과 공유 라이브러리의 메모리 사용률의 차이가 크지 않음


동적(공유)라이브러리

- 라이브러리를 여러 프로그램이 사용될 때 라이브러리 코드 영역을 공유

- 고로 각각의 프로그램의 사이즈가 작아진다는 장점

- 단점은 실행속도가 느리고 실행파일이 배포된 시스템에 컴파일시 사용된 메이저 버전의 동적 라이브러리가 없거나 혹은 있으도 메이저 버전이 다르면 프로그램이 작동되지 않음

- 이런 경우 만약을 대비해 공유라이브러리도 함께 배포

- 하나만 로딩해서 여러 프로세스가 공유해서 사용

- 해당 공유 라이브러리를 필요로 하는 프로세스가 하나라도 있으면 메모리에 로딩되어서 해당 라이브러리를 필요로 하는 프로세스가 하나도 없을 때까지 계속 메모리에 남아있음

- 메모리 효율이 좋음

- 라이브러리와 실행바이너리 사이의 연결 시간 및 실행시간이 상대적으로 커짐


시스템에서 응급시에 필수로 쓰이는 유틸리티와 실행속도를 극대화해야 하는 몇몇 서버를

제외하고는 대부분 동적 라이브러리를 사용한다.


*shared library와 dynamic link library는 다른 개념이다

그러나 대부분의 경우 dynamic link library는 shared library를 만들 때 사용됨


확장자별 라이브러리 종류

*.a: 리눅스/정적 라이브러리

*.so: 리눅스/동적라이브러리

*.lib: 윈도우/정적라이브러리

*.dll: 윈도우/동적라이브러리




정적 라이브러리를 가지고 동적라이브러리로 만들기

a파일(정적라이브러리)에서 o파일(오브젝트)을 뽑아낸 다음 ld로 so타겟으로 해서 만들면된다.

$ar x abc.a

 a.o, b.o, c.o

$gcc -shared -o abc.so *.o //다시 o를 lib로 묶는다


라이브러리와 헤더파일

1. 다르다.

라이브러리는 기계어로 번역된 라이브러리이고,

헤더파일은 컴파일 하기 전의 즉, 프로그래머가 이해할 수 있고 문법에 맞게 작성되어 있는

선언들의 집합이다.


헤더가 여러개 모이는 것 != 라이브러리

컴파일된 산물인 *.o(오브젝트)파일을 여러개 모아 놓은 것 == 라이브러리


라이브러리를 사용하기 위해서 해당 라이브러리의 헤더파일이 있어야한다. 링커가 알아먹을 수 있는

심볼네임을 가지고 라이브러리를 뒤져서 링크를 하게 된다.

컴파일러가 이런 헤더파일을 가지고 심볼네임을 만들어서 오브젝트 파일에 넣어주면 링커가 

해당 심볼네임을 가지고 라이브러리를 뒤져서 링크를 하게 된다.


공유와 동적의 차이

- 두개의 차이를 특별히 나누지 않는다. 다만 동적lib를 공유방식으로 사용하느냐, 독립적으로 사용하느냐는 메모리에 load할 때 결정된다. 'man dlopen'참조