라이브러리
- 프로그래밍에 사용할 수 있게 만들어져 있는 함수와 변수들 묶음.
- 미리 함수나 변수들이 컴파일되어 있음.
- 소스 파일 컴파일 과정 중 링크만 하면 사용가능.
정적 라이브러리
- lib<이름>.a (ex)libc.a : 표준 C 정적 라이브러리).
- 컴파일 과정에서 라이브러리내에 *.o 파일들이 실행 파일에 링크되어 삽입 됨.
- 단점 : 1. 각각의 실행 파일에 *.o 파일들이 중복하여 링크되어 있기 때문에 하드디스크 공간 낭비.
2. 실행될 때 메모리 공간 낭비.
ex ) a.c 소스파일 libc.a(표준 C 정적 라이브러리) 컴파일 하여 a 라는 실행 파일 만들어 짐
b.c 소스파일 libc.a(표준 C 정적 라이브러리) 컴파일 하여 b 라는 실행 파일 만들어 짐.
1. a, b 실행 파일안에는 libc.a 안에 포함된 obj 파일들이 중복되어 삽입되어 있으므로
하드디스크 공간 낭비.
2. a, b 실행 시에는 메모리 공간에 중복되는 libc.a에 해당하는 내용들이 로드 되어
메모리 공간 낭비.
공유 라이브러리
- lib<이름>.so.<메이저버전>.<마이너버전>.<패치버전>
- 컴파일 과정중 소스내에 라이브러리에서 지원하는 함수가 사용되면 실제 함수 오브젝트와 링크하
는 것이 아니라 공유 라이브러리를 사용한다는 표시를 함.
- 공유 라이브러리는 사용하는 프로세스가 하나라도 존재하면 메모리에 로딩&상주 되어 있다.
참조 : 정적 라이브러리와 공유 라이브러리가 같이 존재할 경우 공유 라이브러리 우선으로 링크 된다.
- 장점 : 메모리 절약, 하드디스크 공간 절약.
- 단점 : 실행 속도 감소, 라이브러리가 존재 하지 않거나 메이저 버전이 다르면 실행되지 않는다.
공유 라이브러리 동작원리
- 컴파일된 프로그램을 실행하면 execve()시스템 콜은 프로그램 헤더를 읽어 공유 라이브러리를 사
용한다는 정보를 얻고 동적 링커 (ex:/lib/ld-linux.so.2 (리눅스 기준))도 같이 프로세스의 주소 공
간에 로드 한다.그리고 제어권을 동적 링커에게 넘긴 후 롱적 링커는 프로그램이 필요로 하는 공유
라이브러리의 함수의 주소를 이미 메모리에 로드되어 있는 공유라이브러리에 재매핑 한다.
동적 링커의 종류
1. a.out 바이너리 포맷의 공유 라이브러리 링크를 위한 /lib/ld.so
2. ELF 바이너리 포맷의 공유 라이브러리 링크를 위한 /lib/ld-linux.so.2

- 프로그래밍에 사용할 수 있게 만들어져 있는 함수와 변수들 묶음.
- 미리 함수나 변수들이 컴파일되어 있음.
- 소스 파일 컴파일 과정 중 링크만 하면 사용가능.
정적 라이브러리
- lib<이름>.a (ex)libc.a : 표준 C 정적 라이브러리).
- 컴파일 과정에서 라이브러리내에 *.o 파일들이 실행 파일에 링크되어 삽입 됨.
- 단점 : 1. 각각의 실행 파일에 *.o 파일들이 중복하여 링크되어 있기 때문에 하드디스크 공간 낭비.
2. 실행될 때 메모리 공간 낭비.
ex ) a.c 소스파일 libc.a(표준 C 정적 라이브러리) 컴파일 하여 a 라는 실행 파일 만들어 짐
b.c 소스파일 libc.a(표준 C 정적 라이브러리) 컴파일 하여 b 라는 실행 파일 만들어 짐.
1. a, b 실행 파일안에는 libc.a 안에 포함된 obj 파일들이 중복되어 삽입되어 있으므로
하드디스크 공간 낭비.
2. a, b 실행 시에는 메모리 공간에 중복되는 libc.a에 해당하는 내용들이 로드 되어
메모리 공간 낭비.
공유 라이브러리
- lib<이름>.so.<메이저버전>.<마이너버전>.<패치버전>
- 컴파일 과정중 소스내에 라이브러리에서 지원하는 함수가 사용되면 실제 함수 오브젝트와 링크하
는 것이 아니라 공유 라이브러리를 사용한다는 표시를 함.
- 공유 라이브러리는 사용하는 프로세스가 하나라도 존재하면 메모리에 로딩&상주 되어 있다.
참조 : 정적 라이브러리와 공유 라이브러리가 같이 존재할 경우 공유 라이브러리 우선으로 링크 된다.
- 장점 : 메모리 절약, 하드디스크 공간 절약.
- 단점 : 실행 속도 감소, 라이브러리가 존재 하지 않거나 메이저 버전이 다르면 실행되지 않는다.
공유 라이브러리 동작원리
- 컴파일된 프로그램을 실행하면 execve()시스템 콜은 프로그램 헤더를 읽어 공유 라이브러리를 사
용한다는 정보를 얻고 동적 링커 (ex:/lib/ld-linux.so.2 (리눅스 기준))도 같이 프로세스의 주소 공
간에 로드 한다.그리고 제어권을 동적 링커에게 넘긴 후 롱적 링커는 프로그램이 필요로 하는 공유
라이브러리의 함수의 주소를 이미 메모리에 로드되어 있는 공유라이브러리에 재매핑 한다.
동적 링커의 종류
1. a.out 바이너리 포맷의 공유 라이브러리 링크를 위한 /lib/ld.so
2. ELF 바이너리 포맷의 공유 라이브러리 링크를 위한 /lib/ld-linux.so.2

반응형
'개발' 카테고리의 다른 글
EZ_X5_5_minicom이용한 zmodem프로토콜을 통한 파일 전송 문제 시 해결책 (1) | 2009.03.17 |
---|---|
MB404에 우분투 (ubuntu) 설치 (0) | 2009.03.09 |
컴파일&링킹 요약 정리 (0) | 2009.03.04 |
프로세스 와 메모리의 관계에 관해 (0) | 2009.02.17 |
MAC OS X (10.5.X) Leopard 에서 root 권한 얻기 (0) | 2009.02.02 |