시스템 콜 및 라이브러리 함수를 이용하여 소스 프로그램을 작성하면 컴파일 과정을 통해
실행 파일을 만들어야 한다
또한 이 실행 코드를 재사용하기 위해서 라이브러리를 생성하여 사용하기도 한다.
이 절에서는 리눅스에서 컴파일 하는 방법과 과정을 소개하고
정적 혹은 공유 라이브러리를 작성하는 방법 및 해당 라이브러리를 사용하기 위해서
설정해야 할 사항에 대하여 살펴본다.
컴파일
컴파일 방법은 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)라이브러리 두 종류가 있다.
그 차이점과 생성 방법을 알아보도록 하자
이 정적 라이브러리 파일은 확장자로 .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명령을 이용하면 캐쉬를 업데이트 한다.
실행 파일을 만들어야 한다
또한 이 실행 코드를 재사용하기 위해서 라이브러리를 생성하여 사용하기도 한다.
이 절에서는 리눅스에서 컴파일 하는 방법과 과정을 소개하고
정적 혹은 공유 라이브러리를 작성하는 방법 및 해당 라이브러리를 사용하기 위해서
설정해야 할 사항에 대하여 살펴본다.
컴파일
컴파일 방법은 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 도구를 이용하여 아카이브(모아놓은) 해놓은 것
컴파일 과정 중 링크 단계에서 프로그램의 오브젝트 코드와 지정한 라이브러리의 오브젝트코드를
결합하여 하나의 실행
정적 라이브러리 란 미리 만들어 놓은 라이브러리 함수의 오브젝트 코드를
ar 도구를 이용하여 아카이브(모아놓은) 해놓은 것
컴파일 과정 중 링크 단계에서 프로그램의 오브젝트 코드와 지정한 라이브러리의 오브젝트코드를
결합하여 하나의 실행
헤더파일을 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명령을 이용하면 캐쉬를 업데이트 한다.
'linux > system programming' 카테고리의 다른 글
6. 리눅스 시스템 프로그래밍 - strace 와 ltrace (2) | 2011.06.26 |
---|---|
5. 리눅스 시스템 프로그래밍 - 디버깅 (1) | 2011.06.26 |
3. 리눅스 시스템 프로그래밍 - 시스템 콜과 라이브러리 함수 목록 (0) | 2011.06.22 |
2. 리눅스 시스템 프로그래밍 - 라이브러리 함수와 시스템콜 (0) | 2011.06.22 |
1. 리눅스 시스템프로그래밍 (0) | 2011.06.22 |