임베디드 레시피

Egloos | Log-in





Linux에서 라이브러리를 만드는 방법은?


뭘 알아야 이해를 하지

Linux 어플리케이션은 주로 static, shard, dynamic library와 함께 만든답니다. 어떤 Library냐에 따라 컴파일 방법이 다르며, 어플리케이션이 실행될 때도 메모리에 로딩되는 과정이 조금 다르답니다.  컴파일 과정과 메모리에 로딩되는 과정에 대해 자세히 알아보죠.
 
Static library
static library 만들기 위해 헤드 파일을 하나 만들어 보아요.


   
static library에 해당 되는 C 소스도 만들고요. 


 
이 두 개의 파일을 가지고 static library를 만들어 보아요.
컴파일 하는 방법은
 

이렇게 하시면 libmylib.a 라는 이름을 가진 static library가 만들어 진답니다.
이제 libmylib.a library를 사용하는 main 프로그램을 만들어 보아요.

 
static library와 main 프로그램을 함께 컴파일을 해 보도록 하죠.

# arm-linux-gcc -o static main.c -L ./ -lmylib –g -O0 


 
자~~! 이제 static 라는 이름을 가진 최종 바이너리가 만들어 졌답니다.
 
 
 
컴파일을 조금 더 편리하게 하기 위해서 Makefile을 만드셔도 되지만, 쉘 스크립트를 만들어도 된답니다.
 

 
# chmod 777 start_static        
# ./start_static    

타겟에서 static 어플리케이션을 실행 해 보죠.
램디스크에 example라는 폴더를 만들고, 이 폴더에 static 프로그램을 넣어 둡니다.

 
그리고 타겟을 부팅 시킨 후에 이곳으로 이동해서 static 어플리케이션을 실행하면 됩니다.


 Shared library
이번에는 shared library를 만들어 보아요.
소스는 동일하구요, 컴파일 방법만 다르게 하시면 됩니다.

                            # vim shared_script
# chmod 777 shared_script
# ./shared_script      
 
컴파일을 하게 되면 다음과 같은 결과물을 보실 수가 있어요.


  
 서로 다른 바이너리로 만들어 진답니다. 타겟에서 shared 어플리케이션을 실행하기 위해서는 반드시 library path를 설정해 줘야 한답니다. 램디스크의 example라는 폴더에 shared와 libmylib.so 파일을 넣어 둡니다. 그리고 다음과 같은 명령어로 패스를 알려 줍니다.

그리고 타겟을 부팅 시킨 후에 이곳으로 이동해서 shared 어플리케이션을 실행하면 됩니다.


Dynamic Library

이제 마지막으로 dynamic library를 만들어 보아요. static과 shared에서 사용한 main.c 파일은 그냥 사용하시면 안되구요, 아래와 같은 프로그램으로 만드셔야 해요. 여기서 가장 중요한 부분은 바로 dlopen(plug_num[i].lib, RTLD_NOW) 랍니다. dlopen함수에 대해서는 아래에서 다시 자세히 살펴보도록 하죠.


 
프로그램이 잘 실행되기 위해서는 먼저 plugin.cfg 파일이 필요하니 간단하게 만들어 보죠.
 
소스 준비는 모두 끝났으니, 이제 컴파일을 위해 스크립트를 만들어 보아요.
 
#chmod 777 dynamic_script
# ./dynamic       @ 타겟에서 실행하는 방법
 
shared library와 마찬가지로 libmylib.so와 dynamic 두 개의 결과물을 보실 수가 있답니다.
 

 

그리고 타겟을 부팅 시킨 후에 이곳으로 이동해서 dynamic 어플리케이션을 실행하면 됩니다.



메모리에 할당

 Library 만드는 3가지 방법에 대해 알아 보았는데, 타겟에서 이 프로그램을 실행하면 언제 메모리 할당되는지 알아보죠.
static library는 static 바이너리에 포함이 되면서 하나로 만들어 지죠. 즉, static 이라는 binary안에 libmylib.a 코드가 포함되죠. 그래서 실행을 했을 때, static 바이너리 크기 만큼 메모리에 로딩을 한답니다.
shared library는 shared와 libmylib.so가 따로 만들어 지죠. shared 어플리케이션을 실행하면 shared의 main함수가 실행됨과 동시에 libmylib.so 는 이미 메모리에 로딩이 되어 있답니다. 이것은 커널이 자동적으로 해 준답니다. shared 어플리케이션이 kill 되지 않는 한 계속 메모리에 로딩이 되어 있는 것이 특징이죠.
dynamic library는 shared library와 거의 동일하게 컴파일이 되지만 메모리 로딩에 있어서 서로 다른 시점이 있어요. 즉, dynamic 어플리케이션을 실행을 하면 libmylib.so가 바로 메모리에 로딩되는 것이 아니라 개발자가 직접 지정한 소스를 지나야만 비로소 libmylib.so가 메모리에 로딩이 된답니다. 반대로 메모리에서 libmylib.so 내리는 시점도 개발자가 원하는 대로 지정을 할 수가 있답니다.
Dynamic library의 main.c에서 dlopen함수와 dlclose함수에서 libmylib.so 라이브러리를 메모리에 올렸다가 내린답니다.



램디스크 만들기, 어플리케이션 실행 – “404” 

 

by 히언 | 2011/02/07 00:20 | SOTO Story | 트랙백 | 핑백(1) | 덧글(2)

Linked at 친절한 임베디드 시스템 개발자.. at 2011/02/07 00:23

... p; 405 Linux 포팅 완료까지의 절차가 어떻게 되죠? 406 Linux에서 라이브러리를 만드는 방법은? 407 ARM 프로세서에 WinCE 포팅을 위한 준비사항은? ... more

Commented by boz at 2011/02/08 16:49
cygwin에서도 똑같나요?
Commented by soto at 2011/02/08 16:49
직접 해 본적은 없지만 기본 원리는 비슷할겁니다 ㅋㅋ
하지만 cygwin에서의 리눅스는 변수가 많으니 뭐라 장담은 못하겠어요 ㅎㅎ
※ 이 포스트는 더 이상 덧글을 남길 수 없습니다.

◀ 이전 페이지          다음 페이지 ▶