'정적 라이브러리'에 해당되는 글 2건

  1. 2011.07.04 [Hack #17] ar - 정적 라이브러리 다루기
  2. 2011.07.02 [Hack #6] 정적 라이브러리와 공유 라이브러리 1
2011. 7. 4. 02:04

♧ 사실 ar 명령으로 생성한 아카이브는 정적 라이브러리에 국한되지 않고

tar(1) 등과 마찬가지로 범용적인 비압축 아카이브로 사용할 수 있다.

그러나 일반적으로는 정적 라이브러리를 다루기 위해 사용된다.

   

   

▶ 아카이브를 생성할 경우 :: ar rcus [라이브러리 이름] [오브젝트 파일들]

r 옵션 :: 새로운 오브젝트 파일이면 추가, 기존 파일이면 치환함.

c 옵션 :: libhoge.a 파일이 존재하지 않아도 경고 메시지를 출력하지 않음.

u 옵션 :: 오브젝트 파일의 타임스탬프를 비교해 새로운 파일일 경우에만 치환함.

s 옵션 :: ranlib(1)과 마찬가지로 아카이브 인덱스를 생성.

→ 아카이브 인덱스를 생성하지 않으면 링크 속도가 느려지고, 시스템 환경에 따라서는 에러가 발생.

(※ 아카이브 인덱스는 nm -s로 조회할 수 있다.)

   

▶ 기존 아카이브 파일에 오브젝트 제거 :: ar ds [라이브러리 이름] [오브젝트 파일들]

d 옵션 :: 아카이브 모듈을 삭제

→ 삭제할 파일이 없다면 아카이브를 건들지 않음.

   

▶ 아카이브의 내용을 조회 :: ar tv [라이브러리 이름]

t 옵션 :: 아카이브에 있는 파일 리스트 출력

v 옵션 :: 자세한 내용을 보여주는 verbose 모드.

→ 이 옵션을 이용하면 파일크기나 갱신시각 등의 정보도 출력.

   

▶ 아카이브에서 파일을 추출하려면 :: ar xv [라이브러리 이름]

x 옵션 :: 아카이브에서 오브젝트 파일 추출

→ v옵션을 지정하면 추출한 파일에 대한 파일명 출력.

   

 

▷ ar 명령은 정적 라이브러리를 생성할 때뿐만 아니라,

정적 라이브러리의 기능을 부분적으로 변경하고자 할 경우에도 사용할 수 있다.

라이브러리가 모두 오픈 소스로 구성되어 있지 않은 이유 등으로

정적 라이브러리를 처음부터 다시 작성할 수 없는 경우에 편리하게 이용될 수 있다.

   

그 밖에도 아카이브 냉의 이동, 제거 등 아카이브를 다루는 옵션이 더 있지만,

대부분의 경우 위에서 설명한 옵션만으로도 문제가 없을 것이다.

   

Posted by devanix
2011. 7. 2. 13:24

[ 정적 라이브러리 (static library) ]

♧ 정적 라이브러리는 여러 프로그램에서 사용되는 함수를 포함하는

오브젝트 파일을 하나의 파일로 다룰 수 있도록 정리해 놓은 것.

   

▷ 프로그램을 작성할 때는 소스 파일을 분류해서 일정한 분량으로 나누어

각각의 오브젝트 파일로 컴파일 한 후, 이를 최종적으로 링크해서 하나의 실행 가능한 파일을 생성한다.

이때 다른 프로그램에서도 사용될 만한 모듈이 여러 개의 오브젝트 파일로 나뉘어 있으면

이것들을 한 덩어리로 다루기가 번거로워진다. 그래서 생각해낸 것이 아카이브 파일이다.

   

▷ archive(아카이브) 파일(.a) - 여러 개의 오브젝트 파일을 하나의 파일로 모아놓은 것.

▷ ar(1) 명령을 사용해 여러 개의 오브젝트 파일을 하나의 아카이브 파일로 합칠 수 있다.

▷ OS에 따라 ranlib(1)를 사용하면 이 아카이브 파일 내의 오브젝트가 제공하는 심볼 정보를 해시화해서,

심볼을 제공하는 오브젝트 파일을 효율적으로 검색할 수 있게 된다. (ar -s와 같음)

이와 같은 아카이브 파일을 정적 라이브러리라 한다.

   

▶ 정적라이브러리 생성

ⓐ 오브젝트 파일 생성.

ⓑ 아카이브 파일로 묶어 줌 / 확인.

ⓒ 실행 가능한 파일 생성

▷ 정적 라이브러리를 링크할 경우,

링커는 다른 오브젝트 파일에서 정의되지 않은 심볼을 찾아 지정된 정적 라이브러리에서

해당 심볼을 정의하고 있는 오브젝트 파일의 사본을 추출해서 실행 파일 내에 포함.

▷ 이 경우에는 baz.o 내에 정의되지 않은 심볼이

libfoo.a에 포함되어 있는 오브젝트 파일들 중에 정의되어 있다면,

그 오브젝트 파일을 찾아 실행 파일 baz에 복사해서 링크 한다.

   

▷ 여기서 핵심은 라이브러리 내의 오브젝트 파일 단위로 처리된다는 점,

링크 시에는 실행 파일 내에 오브젝트 파일의 사본이 포함된다는 점.

▷ 정적 라이브러리를 링크해서 생성된 실행 바이너리를 실행할 경우에는

정적 라이브러리가 없어도 관계 없다. 필요한 코드는 실행 바이너리에 복사되어 포함되기 때문.

   

[ 공유 라이브러리 (shared library) ]

♣ 정적 라이브러리의 경우 여러 오브젝트 파일의 아카이브였다면, 공유 라이브러리는

여러 오브젝트 파일을 하나의 거대한 오브젝트 파일로 만들어 이를 공유할 수 있도록 한 것.

- OS의 가상 메모리 관리 시스템이 진보함에 따라, 하나의 파일을 mmap(2)등을 이용해

여러 프로세스에서 메모리를 공유해서 참조할 수 있게 되었다.

이를 활용할 수 있도록 한 것이 공유 라이브러리(or 공유 오브젝트)이다.

(최근의 OS에서는 일단 메모리맵을 설정해 두는 것만으로 실제로 그 메모리 내용이 참조되기까지

디스크 액세스를 지연시킬 수 있으므로, 거대한 오브젝트 파일이라도 그다지 문제가 되지 않는다.)

   

▶ 공유 라이브러리 생성

-shared옵션 : 공유 오브젝트를 만들게 된다.

-Wl,-soname옵션 : 공유 오브젝트에 특정 SONAME을 지정.

(SONAME에 따라 실행 시에 링크할 공유 라이브러리가 결정)

   

▷ 공유 라이브러리는 정적 라이브러리와 같은 방법으로 링크 할 수 있다.

- 그러나 실제 내부적인 처리는 많이 다르다.

- 이 경우 baz.o 내에 정의되지 않은 심볼이 공유 오브젝트에 정의되어 있다면,

해당 공유 오브젝트의 SONAME을 실행 파일의 NEEDED에 설정할 뿐,

공유 오브젝트에 포함되어 있는 코드 자체를 복사하지는 않는다.

(정적 라이브러리와 달리 *.so 내에 어떤 오브젝트 파일이 있는지는 기본적으로 남지 않는다)

- 여기서 핵심은 공유 라이브러리 단위로 처리된다는 점,

링크 시에는 필요한 공유 라이브러리의 SONAME만을 실행 파일에 NEEDED로 등록해 둔다는 점이다.

- 공유 라이브러리를 링크한 실행 파일을 실행할 경우에는 동적 링커 로더가

NEEDED의 정보를 이용해 필요한 공유 라이브러리를 찾아내어,

실행 시에 해당 프로세스의 메모리맵을 조작해서 공유 라이브러리를

링크한 실행 파일을 실행할 경우에는 공유 라이이브러리가 시스템에 반드시 존재해야 한다.

실제 라이브러리 코드는 실행 파일에 포함되어 있지 않고 공유 라이브러리에만 존재.

(※ /etc/ld.so.conf 수정, ldconfig)

   

   

[ 라이브러리 차이점]

♣ 메모리 크기

▷ 실행 시에 필요한 메모리 크기도, 최근의 OS에서는 공유 라이브러리 쪽이 유리.

▷ 특히 PIC(Position Independent Code)로 생성해 두면 코드 부분이 어느 주소에 위치하더라도

변경할 필요가 없기 때문에, 공유 라이브러리를 하나의 물리적인 메모리 페이지에 읽어 들이는 것만으로

각각의 메모리 공간에 있는 프로세스에서 공유 라이브러리의 메모리 페이지를 공유 할 수 있게 된다.

 

♣ 파일 크기

정적 라이브러리:

라이브러리에 포함된 코드를 여러 실행 파일에서 이용하게 되면

각 오브젝트가 매번 복사되므로 용량이 늘어나게 됨.

공유 라이브러리:

라이브러리 코드 자체는 실행 파일에 복사되지 않고 공유 라이브러리 파일에서만

포함하고 있으므로, 라이브러리 코드를 이용하는 실행 파일이 많더라도

라이브러리 코드 크기만큼의 용량이 증가하지 않음.

    

♣ 라이브러리 패치 (문제가 되는 코드 발견시)

정적 라이브러리:

컴파일된 실행 바이너리에 복사된 정적 라이브러리의 오브젝트가 남아 있으므로,

해당 라이브러리를 사용하는 모든 실행 바이너리를 재컴파일 해야 함.

공유 라이브러리:

공유 라이브러리만 수정하면 됨.

데몬과 같이 장시간 실행하고 있는 프로그램의 경우, 메모리에 로드 되어 있으므로

새로운 공유 라이브러리를 참조하도록 재실행 해야 함.

 

  

Posted by devanix