sliver__

[Static and Shared Library] - Static Library 개념 / ar 명령어 본문

CS/UNIX

[Static and Shared Library] - Static Library 개념 / ar 명령어

sliver__ 2022. 10. 22. 00:24
728x90

[Static Library]

  • static library는 archive file을 함께 모아놓은 object module의 집합이다.
  • object code를 link time에 함께 코드와 link 한다.

 

[Examining the Process Memory Image]

  • 위 그림은 Linix에서 프로그램 memory image가 할당되는지 보여준다.
  • memory의 위 부분은 환경변수 지역이다.
  • 바로 아래는 스택의 top 부분이고 UNIX platform에서는 아래로 증가한다.
  • stack의 가장 아래부분은 할당되지 않은 메모리의 여유 공간이다.
  • 왼쪽 박스들은 static library module과 object module의 linking process를 보여준다.
  • 화살표들은 linker가 0x800000번지부터 0x80049F18번지까지 메모리를 형성하는지 보여준다.
  • 해당 지역들은 실행 가능한 파일들이 저장되있는 공간이다.
  • 0x800000 번지 아래 지역은 프로그램이 시작됄 때 메모리 공간으로 가져오기 위해 dynamic libraries 들을 위한 예약된 공간이다.
  • 해당 지역은 shared data들이 load되기 위한 공간이다.
  • main program 하위의 libarary code는 static library code 라고 부른다.
  • static 한 이유는 program이 link 되면 절대 변하지 않기 때문이다.
  • shared libarary는 0x800000번지 아래에 exection time에 load된다.
  • 만약 shared library 들을 바꾸면 프로그램에 변경된 library들이 해당 공간에 load 된다.
  • static library code는 executable 파일에 적히면 절대 변하지 않는다. 

 

[static library 생성]

 ar -r libpasswd.a import.o getuid.o
  • -r 옵션 : 필요한 경우 archive가 생성되고 이미 존재하는 경우 target module을 추가 또는 업데이트 하는 옵션
  • archive는 .a를 사용하고 covention은 lib를 붙인다.
  • archive를 위한 target module에 수정이 있다면 해당 module만 다시 archive 하면 된다.
$ ar -t libpasswd.a
import.o
getuid.o
$
  • -t 옵션 : 어떤 module이 archive에 포함되어있는지 보는 옵션
$ ar -tv libpasswd.a
rw-r----- 1001/2010   2536 May 11 12:18 2000 import.o
rw-r----- 1001/2010   2948 May 11 12:18 2000 getuid.o
$
  • -tv 옵션 : archive된 module list와 더 자세한 정보를 확인하는 옵션
  • 1001 / 2010 은 userID / group ID number 이다.

 

[Linking with Static Libraries]

$ cc -o getuid main.o libpasswd.a -lstdc++
  • -l 옵션을 주어 링킹할 수 있다.
  • 주어진 *.o object 파일과 static library를 linking 한다.
$ make getuid
cc -c -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -Wall -fhandle-exceptions main.cc
cc -o getuid main.o -L/home/me/myproject -lpasswd -lstdc++
$
  • 보통 shared libarary 들은 한 디렉토리 안에 관리되고 -L 옵션을 주어 디렉토리가 있는 경로를 알려준다.
  • -lpasswd는 linker에게 libpasswd.a 라이브러리를 찾을 수 있도록 알려준다.

 

  • 위는 linking process를 보여준다.
728x90
Comments