컴퓨터활용/유닉스

*.a 와 *.so 차이점

멜번초이 2016. 6. 24. 23:15


*.a 는 아카이브(Archive) 라는 뜻이다. 보통 우리가 object 파일들을 묶어서 library 로 제공하는 것과 동일하다. 이런 의미에서 *.so 도 동일한 성격이다. java 프로그램을 짜본 개발자라면 jar 파일을 연상하면 이해가 쉽다. 


C프로그램에 1차 컴파일하면 .o 파일이 생성된다. 소스 속에 main() 함수가 있다면 실행 바이너리로 컴파일 되겠지만 외부에서 호출할 수 있는 function 들로만 구성되어 있다면 .c 소스를 컴파일하면 .o 파일이 생성된다. 흡사 .java 를 컴파일 하면 .class 가 생성되는 것과 같다.  java 는 원래 태생이 c 언어에서 시작되었기 때문에 그 구조가 비슷할 수 밖에 없다. 


이제 본론으로 들어가서 *.a 와 *.so 의 차이점을 생각해 보면 *.so 는 Shared Object 라고 부른다. *.sl 로 확장자를 쓰기도 하는데 이것은 IBM 과 HP 진영의 표기상의 차이점일 뿐이다.  정적라이브러리는 ar 이란 명령어로 생성을 하고 .so나 .sl 은 cc 명령으로 컴파일하면서 만들게 된다. 정적라이브러리는 프로그램이 실행될 때 참조되어 메모리에 같이 묻어서 올라가게 되고 공유라이브러리는 프로그램이 실행되는 중에 교체도 가능한 방식이다. 


정적라이브러리는 Static Library 라고 하기도 하고 Archive Library라고 부르기도 한다. 반면에 공유라이브러리는 Shared Library 라고 한다. 정적라이브러리의 로직이 변경 되면 이것을 불러서 사용하는 프로그램은 재컴파일 되어야 변경된 로직이 반영된다. 공유라이브러리는 재컴파일 필요없이 프로그램만 재기동하면 변경된 로직이 반영된다. 그러나 어쨌거나 프로그램이 실행되는 시점에는 정해진 디렉토리에 이 라이브러리 파일들이 존재하고 있어야 된다. 그 정해진 위치란 LIBPATH, LD_LIBRARY_PATH 이고 이곳에서 해당 library를 검색하게 된다. 보통 솔루션 업체들은 *.a 와 *.so 를 함께 제공해 주기도 하는데 이것은 이 솔루션을 이용하여 어떤 형태의 프로그램을 만들지 알 수 없기 때문이다., 

 

정적라이브러리(Archive Library)

공유라이브러리(Shared Library)
확장자.a.so(IBM) 이나 .sl(HP)
라이브러리 로직변경시 반영방법

*.a 교체 후 재컴파일 후 재실행

*.so 교체후 컴파일 없이 재실행
작성방법

ar

ld

실행속도상대적 빠름상대적 느림


여전히 공유라이브러리는 개선된 점이 있으나 로직이 변경될 때 이 라이브러리를 불러서 사용하는 프로그램이 재실행이 되어야 하는 핸디캡을 가지고 있다. 이 단점을 개선한 것이 동적적재라이브러리인데 dlopen() 이라는 시스템콜을 이용하여 동작하게 된다. 이 dlopen()을 응용하여 상품화시킨 것이 티맥스소프트의 dlcall 이다. 이것은 라이브러리별 변경여부를 메모리상에서 관리하고 변경이 감지되면 실행중인 프로그램의 동적라이브러리를 실시간으로 재적재해 주는 기능을 포함하고 있다.

같이 보면 좋은 글 :   LIBPATH 환경 변수 

'컴퓨터활용 > 유닉스' 카테고리의 다른 글

gdb 사용법  (0) 2016.07.19
LIBPATH 환경 변수  (2) 2016.06.24
리눅스에서 kitchen 설치  (0) 2014.10.16
ftp server install in Ubuntu Linux  (0) 2014.10.14
telnetd install in Ubuntu Linux  (0) 2014.10.14