Korea FreeBSD Users Group
Korea FreeBSD Users Group News, Internal, Projects, Home
Software, Support, Documentation

(Answer) (Category) FreeBSD 비공식 한국어 FAQ : (Category) 프로그래밍 :
공유 라이브러리를 어떻게 만들죠?
다음은 공유 라이브러리를 만드는 간단한 예입니다.

우선 현재 디렉토리에 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
[Append to This Answer]
Next: (Answer) FreeBSD에서 thread를 사용하고 싶어요.
This document is: http://www.kr.freebsd.org/cgi-bin/fom.cgi?file=66
[Search] [Appearance]
This is a Faq-O-Matic 2.719.

Copyright © 1998-2003 Korea FreeBSD Users Group.
All rights reserved. webmaster at kr.FreeBSD.org
Powered by FreeBSD