다음은 공유 라이브러리를 만드는 간단한 예입니다.
우선 현재 디렉토리에 shared.c, test_shared.c를 아래와 같이 작성합니다.
shared.c의 내용
-----------------------여기서부터----------------------
int
shared(int a)
{
a *= 5;
return(a);
}
------------------------여기까지-----------------------
test_shared.c의 내용
-----------------------여기서부터----------------------
#include <stdio.h>
extern int shared(int);
int
main(void)
{
int a;
printf("number ?:");
scanf("%d", &a);
printf("result: %d\n", shared(a));
return(0);
}
------------------------여기까지-----------------------
그리고 공유 라이브러리를 구성하는 오브젝트를 만듭니다. 옵션 -fpic는 공
유 라이브러리를 구성하는 오브젝트를 만들기 위해서 필요합니다.
$ gcc -o shared.o -fpic -c shared.c
다음에 공유 라이브러리를 만들고,
FreeBBSD 2.2.x (a.out)
$ ld -Bshareable -o libshared.so.1 shared.o
FreeBSD 3.x (elf)
$ gcc -shared -o libshared.so.1 -Wl,-S,-soname=libshared.so.1,--whole-archive shared.o
대표명으로 링크합니다.
$ ln -s libshared.so.1 libshared.so
이 공유 라이브러리를 사용하는 실행 프로그램을 컴파일합니다.
$ gcc -L. -lshared test_shared.c
공유 라이브러리를 사용해 컴파일한 프로그램을 실행시키려면 해당 공유 라
이브러리가 위치한 디렉토리가 공유 라이브러리 검색 패스(LD_LIBRARY_PATH
)에 들어 있어야 합니다.
자 실행해 봅시다. "number ?:" 다음에 숫자를 입력해 봅니다. 예를 들어 5
를 입력했습니다.
$ env LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. ./a.out
number ?:5
result: 25
정말로 동적 링크가 이루어져 있는가를 확인하려면, shared.c를 변경하여 l
ibshared.so.1을 재구성한 후 a.out을 실행하여 그 변경이 반영되었는지 살
펴보면 됩니다.
예를 들어 shared.c의 "a *=5;"를 "a *= 10;"으로 변경하는 것입니다.
-fpic를 붙이지 않고 컴파일하게 되면, 실행은 되지만 실제로 공유가 되지
않으므로 반드시 -fpic를 주시기 바랍니다.
ELF 형식의 공유 라이브러리에 대한 주의
1. a.out과 달리 ELF 형식의 공유 라이브러리에서 버전 번호는 메이저 1개
뿐입니다.
2. 실행 파일 작성시에 공유 라이브러리를 링크할 경우 lib*.so라는 이름의
파일을 찾아와서 링크하려고 합니다. 실제의 공유 라이브러리로부터 심
볼릭 링크를 걸어 주십시오.
3. 실행 파일에는 -soname으로 지정한 이름이 있으면 DT_SONAME으로 설정되
어 실행시에는 그 이름으로 공유 라이브러리를 검색하여 동적 링크를 합
니다.
따라서 공유 라이브러리 작성시에 -soname을 지정해 두면 프로그램 실행
시에 lib*.so의 링크가 어디로 되어 있던지 간에, 컴파일시에 링크한 버
전의 공유 라이브러리가 사용됩니다.
-soname을 지정하지 않고 공유 라이브러리를 작성하면 실행 파일에 lib*
.so라는 이름이 기록되기 때문에, 나중에 복수의 버전의 공유 라이브러
리를 병행홰서 관리할 필요가 나왔을 때 곤란하게 될 가능성이 있습니다.
4. ld의 -R 옵션이 -rpath로 바뀌었습니다.sonnet |