상세 컨텐츠

본문 제목

정적라이브러리 / 공유라이브러리

Linux기본

by nowpassion 2008. 4. 29. 20:29

본문

1. 정적라이브러리
 - 단순한 object파일의 집합이라고 보시면 됩니다. 일반적으로 .a로 끝나는 파일은
   정적라이브러리입니다.
 - 실행 파일의 크기는 공유라이브러리를 이용할때 보다 커지지만 한번 컴파일 후에는
   라이브러리 파일을 첨부하지 않아도 됩니다.
 - 그러나 임베디드 시스템 같은 메모리가 제한적인 환경에서는 크기에 민감해지기 때문에
   공유라이브러리를 이용하여 컴파일 하는 것보다는 좋지 않다고 볼 수 있습니다.
   즉 같은 라이브러리를 쓰는 여러프로그램이 존재시 각 프로그램에 포함되어 컴파일되었으므로
   공간을 많이 먹게되는 구조라고 할 수 있습니다.
 - 라이브러리에서 버그가 발견될 경우 실행파일까지 컴파일을 해야하므로 버그에 취약한
   구조라고 할 수 있겠습니다.

 - 제작방법
   ex) star.c
   #include <stdio.h>
   void starlib(int arg){
       printf("starlib : %d\n");
   }

  1) 일단 컴파일 해야겠죠?
   # gcc -c star.c
  2) ar을 이용하여 라이브러리 형태로 만들어줍니다.
   # ar crv libstar.a star.o
  3) 이를 이용해 컴파일 할때는?
   # gcc -o main.c -L. -lstar
   (-L은 라이브러리의 위치, -l은 라이브러리 명)
   (* 자동적으로 lib을 인식합니다. liba.a -> -la)

2. 공유라이브러리
   - 위와 같은 단점을 보강하기 위해 나타난 것이 공유라이브러리라고 할 수 있습니다.
   - 정적라이브러리와 다르게 공유라이브러리는 컴파일시 포함되어 컴파일 되지않고
     실행 시 라이브러리 위치를 참조하여 런타임시 참조하게됩니다.
     ( 리눅스에는 런타임링커가 존재하는데 ld-linux.so.2등이 해당된다고 볼 수 있습니다.)

  - 역시 장점이라고 하면 자신의 리눅스가 가리키는 라이브러리 위치에 라이브러리를 이동시켜
     놓으면 언제든지 사용할 수 있다는 것이 장점이라고 할 수 있습니다. 실행파일에도 포함되지
     않기 때문에 위에서 언급한 많은수의 프로그램이 한가지의 라이브러리를 사용할 경우 장점을
     띄게 됩니다. 물론 버그에도 더 강하겠죠? 라이브러리만 교체해 넣으면 되니까요..

  - 단점도 있습니다. 바로 위치와 버전입니다. 공유라이브러리는 실제 버전을 가지고 있습니다.
    그런데 main이라는 프로그램이 0.1버전에 적합하게 만들어졌다면? 그리고 제작자가 아닌
    사용자가 그것을 모르고 있다면? 그럼 사용하는 데 문제가 되겠죠?( 물론 의사소통 통로를 통해
    알려주겠지만요..) 그리고 시스템마다 라이브러리 위치가 다를 수 있습니다. 이럴때는 어디로
    위치를 잡아야 할까요?

  - 그렇다해도 정적라이브러리보다는 매리트가 많은 것이 사실입니다.
  - 제작방법
   ex) star.c
  #include <stdio.h>
  void starlib(int arg){
      printf("starlib : %d\n");
  }

 1) "-fPIC" 옵션을 이용해 여러 프로세스에서도 동적으로 심볼위치를 재배치 하게 할 수 있는
      위치 독립적인 목적파일을 만들어 냅니다.
      - gcc -fPIC -c star.c
 2) 목적파일을 만들었으니까 바로 라이브러리 파일을 만들어줍니다.
     -  gcc -shared -W1,-soname,libstar.so.1 -o libstar.so.1.0.1 star.o
        (shared는 공유라이브러리를 생성하겠다는 것이고, -W1은 공유라이브러리 이름을
        지정하기 위해 링커에 넘기는 옵션입니다.)
  3) 실제 링커는 libstat.so.1을 찾아서 실행할려고 할것입니다.그러므로 실제 실행하기 전
      ln -s를 통해 심볼릭 링크를 만들어냅니다.
      - ln -s libstar.so.1.0.1 libstar.so.1(동적 링커)
      - ln -s libstar.so.1.0.1 libstar.so(gcc)
  4) 실제 리눅스는 공유라이브러리를 담아두는 디렉토리가 존재합니다. 실제 그에 대한 설정은
     (Ubuntu 기준) /etc/ld.so.conf파일에 담겨있습니다.
  5) 새로 만든 라이브러리를 해당하는 디렉토리에 이동시킵니다.
  6) 그런다음 ldconfig 명령을 이용하여 라이브러리 cache를 갱신하여 실제 변경내용을
      적용합니다.
    - ldconfig
  7) 이를 이용해 컴파일 할때는?
    - gcc -o main main.c -L. -lstar라고 하면 되겠죠?
    - 혹은 라이브러리가 시스템에서 지정된 위치에 존재할경우에는
      : gcc -o main main.c -lstar
 
 



'Linux기본' 카테고리의 다른 글

UNIX domain socket  (0) 2008.04.30
VIM관련 plugin디렉토리  (0) 2008.04.29

관련글 더보기