본문 바로가기

STUDY

DL(Dynamic Loading) 동적 적재 겉햝기

 하드 디스크에 있는 프로그램을 실행시키기 위해 메모리로 올려 프로세스로 실행을 시킨다. 여기서 프로그램이 메모리보다 크거나 많은 양의 코드를 포함하고 있는 경우를 위해 메모리를 효율적으로 쓰기 위해 동적 적재를 한다.

라이브러리가 함수들이 정의되어 있고 모아져 있는 곳인데 정적 적재의 경우 라이브러리도 같이 메모리에 올라가는 데 이렇게 되면 파일의 크기가 너무 커진다. 그래서 라이브러리는 하드디스크에 있고 그 라이브러리 안에 필요한 함수를 그때 그때 메모리에 올려 사용하는게 동적 적재(DL, Dynamic Loaing) 라는 것이다.


DL과 관련해 대표적으로 쓰이는 함수 3개를 알아보았다.


1) dlopen(FILENAME, flag)

 FILENAME에는 파일이름이나 경로가 들어가는 것이고 flag에는 RTLD_LAZY나 RTLD_NOW가 들어간다.

즉 쉽게 이해하자면 FILENAME에 들어가는 파일(동적 라이브러리)을 열고 어떤 유형으로 검사하면서 예외 처리를 해줄 것인지 결정하는게 flag인 것 같다.

 RTLD_LAZY는 동적 라이브러리가 실행되면서 코드에 정의되지 않은 심볼 처리를 하는데 알아볼 수 없는 에러를 낸다.

RTLD_NOW는 dlopen() 리턴 전에 정의되지 않는 심볼 처리를 하는데 알아볼 수 있는 에러를 낸다.

NOW가 LAZY보다 라이브러리를 여는데 약간의 시간이 더 걸리지만 예외를 찾는 속도가 더 빠르다.

 dlopen의 리턴값은 로드가 성공 했을 경우에는 파일의 핸들( 파일에 접근하는데 쓰이는 디스크립터 )이고, 못 했을 경우에는 NULL이다.


2) dlsym(handle, symbol)

 열려진 라이브러리의 심볼 값을 찾아 주는 함수라는데 즉 열려진 라이브러리에서 원하는 함수를 찾아주는 것이다.


3) dlclose(handle)

 라이브러리를 닫아준다.


DL에 대해 알아보다 직접 DLL(Dynamic Loading Library)를 만들어 사용해 보고 싶어졌다.

test.c → 라이브러리가 될 파일


컴파일

 -fPIC : test.o 파일을 동적 라이브러리로 사용하기 위한 옵션


생성된 test.o 파일을 libtest.so 파일로 컴파일


app.c → 프로그램 역할


app.o 파일을 통해 동적 라이브러리를 사용하는 dynamic_app 실행 파일 생성

환경 변수에 libtest.so 위치 추가 후 dynamic_app 실행


환경 변수에 libtest.so 위치를 추가해야하는 이유는 만약 위치 추가 하지 않고 실행을 시키면 라이브러리의 위치를 읽어오질 못해 파일이 실행되지 않는다.


이제 알아보았던 DL관련 함수를 사용하여 libtest.so의 func를 사용해보자 


hello.c → RTLD_NOW로 libetest.so를 열고 그 핸들값을 void형 변수 handle에 받는다.

  dlsym으로 핸들값 받아오고 그 핸들에 해당하는 라이브러리 즉, libtest.so에 'func'라는 함수를 사용하는데 result에 그 값을 받고   실행시킨다. 그리고 dlclose에 핸들값을 주면서 라이브러리를 닫는다.


컴파일 후 실행시킨다.

 -ldl : 동적으로 라이브러리를 적재하겠다는 옵션



+)참고

-DLL

     https://wiki.kldp.org/HOWTO/html/Program-Library-HOWTO/dl-libraries

-DLL 만들고 사용

    http://hodol.kr/xe/note/1068

-더 자세한 정보


'STUDY' 카테고리의 다른 글

[2014 CODEGATE] weird shark  (0) 2017.02.02
패킷(Packet) 겉햝기  (0) 2017.01.31
super user!  (0) 2016.07.14
vmware 우분투 서버 구축하기  (0) 2016.07.14
스트림과 fd  (0) 2016.07.14