linux/system programming2011. 6. 22. 23:07
시스템 콜 및 라이브러리 함수를 이용하여 소스 프로그램을 작성하면 컴파일 과정을 통해
실행 파일을 만들어야 한다

또한 이 실행 코드를 재사용하기 위해서 라이브러리를 생성하여 사용하기도 한다.

이 절에서는 리눅스에서 컴파일 하는 방법과 과정을 소개하고
정적 혹은 공유 라이브러리를 작성하는 방법 및 해당 라이브러리를 사용하기 위해서
설정해야 할 사항에 대하여 살펴본다.

 컴파일
컴파일 방법은 gcc 소스파일명 -o 실행파일명
 

 
gcc -v --save-temps sample.c -o sample1 
이 명령어는 -v옵션은 컴파일 과정을 화면으로 출력, --save-temps 옵션은 컴파일 과정에서 발생되는
중간 파일을 지우지 않고 저장
이명령어를 실행하면  실행파일 sample1말고도  sample.i    sample.o    sample.s  파일이 더 생성된다
 
cc1 - asm코드를 생성(*.s)
as - 어셈블러, object를 생성(*.o)
collect2 - 링커, 실행파일을 생성


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

 리눅스에서 프로그램을 개발하다 보면 여러 사람들이 함께 개발하는 경우가 종종 있다.
그 때 같은 기능을 여러 사람이 공동으로 사용하게 되는 경우가 있는데,

그러한 기능을 각각의 소스 프로그램에 함수로 넣어 사용하는 방법보다는 라이브러리를 만들어 함께
사용하면
- 사용하기가 훨씬 편리
- 같은 소스코드를 중복 기술하지 않아 효율적인 프로그램 작성 가능
- 다른 프로젝트에도 손쉽게 활용 가능
 
라이브러리의 개요 
기본적으로 제공되는 표준 라이브러리는 /usr/lib에 존재
c 컴파일러는 프로그램 컴파일 시 기본적으로 이 디렉토리(/usr/lib)에서 라이브러리 함수를 찾아 링크 수행

gcc 의 -L 과 -l 옵션을 이용하면 다른 디렉토리에 있는 라이브러리도 이용할수 있음 

라이브러리의 이름은 lib로 시작되며 라이브러리의 의미를 나타내는 이름 다음에 파일의 확장자 .a .so로 구성된다

 예를들면 libm.a libm.so

여기서 m은 math 즉 수학관련 라이브러리를 의미한다 이 라이브러리를 이용하여 컴파일 할때에는
다음과 같이 명령을 수행한다
gcc sample.c -o -lm(소문자 엘 과 엠)
 

라이브러리의 종류 
라이브러리에는 정적(static)라이브러리와 공유(shared)라이브러리 두 종류가 있다.
그 차이점과 생성 방법을 알아보도록 하자

정적 라이브러리
정적 라이브러리 란 미리 만들어 놓은 라이브러리 함수의 오브젝트 코드를
ar 도구를 이용하여 아카이브(모아놓은) 해놓은 것

컴파일 과정 중 링크 단계에서 프로그램의 오브젝트 코드와 지정한 라이브러리의 오브젝트코드를
결합하여 하나의 실행


가능한 파일을 생성한다 
 
이 정적 라이브러리 파일은 확장자로 .a를 가지며 이 라이브러리 함수를 이용할 때에는 관련된
헤더파일을 include하여 사용 

정적라이브러리 생성방법
 


1) mystatic 파일의 오브젝트 코드를 생성한다
 gcc -c mystatic.c

2) ar명령을 이용하여 라이브러리 파일을 생성한다
ar rv libmystatic.a mystatic.o

위 명령을 치면 libmystatic.a 파일이 생긴다

정적 라이브러리 함수 호출예

정적라이브러리 함수를 호출하면서 컴파일을한다
 gcc mymain1.c -o mymain1 -lmystatic -L.
여기서  -lmystatic -L. 는 현재 파일에 있는 라이브러리를 쓴다는 뜻이다
위에서 -L 과 -l (소문자 엘) 옵션을 이용하면 다른 디렉토리에 있는 라이브러리도 이용할 수 있음
 

공유라이브러리 
정적 라이브러리를 이용하여 실행 파일을 생성하면 실행 파일에  라이브러리 함수의 코드가 포함된다

따라서 이 라이브러리 함수를 여러 프로그램에서 사용하면 각각의 실행 파일에 라이브러리 함수의
코드가 포함된다

 따라서 이 라이브러리 함수를 여러 프로그램에서 사용하면 각각의 실행 파일에 라이브러리 함수의 코드가 
 포함되고 동일한 함수의 코드가 메모리 여러 군대에 존재하게 된다.

 이는 메모리나 하드 디스크 공간이 그 만큼 낭비된다는 의미이다.
 
이와 같은 정적 라이브러리 함수의 단점을 극복한 것이 공유 라이브러리이다

프로그램이 공유 라이브러리를 사용하면 실행 파일에 라이브러리 함수 코드가 포함되는 것이 아니라, 
실행 시 사용 가능한 공유코드를 참조하는 방식으로 링크된다

따라서 이 공유 라이브러리 함수를 이용하는 프로그램이 여러개 일지라도 하나의 라이브러리를 함께
이용하므로, 메모리나 하드디스크를 효과적으로 사용할 수 있다.

리눅스에서 공유 라이브러리를 로드하고 참조 함수를 확인하는 프로그램을 동적 로더(ld.so)라고 한다
이 로더는 /etc/ld.so.conf에 설정된 경로를 이용하여 공유 라이브러리를 검색한다.

이 구성 파일에 경로를 추가한 후 ldconfig명령을 이용하면 캐쉬를 업데이트 한다.



 

Posted by babuzzzy