공유 라이브러리

EEEFFEE·2023년 11월 17일

System Programming

목록 보기
16/19

23.11.16 최초 작성

1. 정적 라이브러리(static libary)

  • 오브젝트 파일(.o)들의 복사본
  • 형식 : lib'이름'.a
  • 생성 방법
ar <options> <archive> <object-file..>

ar libdemo.a mod1.o mod2.o mod3.o		//생성

ar tv libdemo.a							//libdemo.a 내용 출력
ar d libdemo.a mod3.o					//mod3.o 제거
  • 사용법
gcc -g -o prog prog.o libdemo.a

gcc -g -o prog prog.o -ldemo			//표준 라이브러리(/usr/lib)에 있는 경우
gcc -g -o prog prog.o -Lmylibdir -ldemo	//표준 라이브러리에 없는 경우

2. 동적 라이브러리(dynamic library)

  • 생성 방법
gcc -g -c -fPIC -Wall mod1.c mod2.c mod3.c
gcc -g -shared -o libfoo.so mod1.o mod2.o mod3.o		//2번에 걸쳐 만들기

gcc -g -fPIC -Wall mod1.c mod2.c mod3.c -shared -o libfoo.so
														//1번에 걸쳐 만들기
  • 사용법
export LD_LIBRARY_PATH='라이브러리가 위치하는 디렉토리'
gcc -g -Wall -o prog prog.c libfoo.so

gcc -g -o prog prog.o -ldemo			//표준 라이브러리(/usr/lib)에 있는 경우
gcc -g -o prog prog.o -Lmylibdir -ldemo	//표준 라이브러리에 없는 경우

2.1 네이밍 규칙

libdemo.so.<major number>.<minor number>.<number>

2.2 코드 내에서 동적으로 라이브러리 적재

  • dlopen, dlclose : 동적 라이브러리를 적재 / 해제하는 함수

#include <dlfcn.h>

void *dlopen(const char *libfilename, int flags);
///
libfilename : 로드할 동적 라이브러리 파일명
flag : so 파일을 메모리로 적재하는 방법 또는 시점과 관련된 설정값

Return : 라이브러리에 대한 handle 반환
(NULL : Fail)


int dlclose(void *handle);
///
handle : dlopen에서 반환받은 shared object handle

Return 
(0 : Success, else : Fail)

  • dlerror : dlopen에 대한 에러메시지 반환

#include <dlfcn.h>

const char *dlerror(void);
///

Return
마지막 dlerror 호출 이후, dlopen 호출에서 발생한 에러 상황에 대한 사유를 문자열로 반환 
(만약 에러가 발생한 적이 없을 경우 NULL이 반환)

  • dlsym : 동적 라이브러리의 심볼(함수/변수명) 가져오는 함수

#include <dlfcn.h> 

void *dlsym(void *handle, const char *symbol)

///
handle : dlopen에서 반환받은 동적 라이브러리 handle
symbol : shared object에서 찾고자 하는 함수명 또는 변수명

Return 
(NULL : Error, else : Success)

2.1 ldd 툴

  • 현재 프로그램이 어떤 라이브러리를 사용하는지 나타냄
ldd <프로그램 이름>

0개의 댓글