공유라이브러리는 정적 라이브러리와 다르게 실행시에 로드되는 라이브러리를 의미한다. 피일 확장자는 대부분 .so로 되어있다. 컴파일 시점, 실행할 시점에 라이브러리를 연결만 하는 방법을 통해 프로그램도 가벼워지고, 귀찮음도 덜 수 있다.
다음의 예제를 통해서 알아보자.
1. Source Code
간단하게 "haheho"를 출력하는 함수를 Shared Library로 작성한 후 main 함수에서 호출하는 예제를 생각해 보도록 하자.
haheho.h
#ifndef _HAHEHO_H_
#define _HAHEHO_H_
void getHaheho();
#endif
haheho.c
#include <stdio.h>
void getHaheho()
{
printf("haheho\n");
}
main.c
#include "haheho.h"
int main(void)
{
getHaheho();
return 0;
}
2. Build
2.1. Compiling with Position Indenpendent Code
가장 먼저 아래와 같이 c 파일을 PIC 옵션과 함께 compile 하는 과정이다.
이를 통해서 haheho.o 파일이 생성된다.
※ 공유 라이브러리 생성을 위해서 반드시 PIC 옵션이 필요하지는 않지만, 없을 경우 문제가 발생할 수도 있다.
$ gcc -c -Wall -Werror -fPIC haheho.c
2.2. Creating a shared library from an object file
haheho.o 파일을 shared object로 만드는 과정이다.
$ gcc -shared -o libhaheho.so haheho.o
2.3. Linking with a shared library
main.c 파일을 compile 하고, libhaheho와 링크시킨다. -l 옵션은 haheho.o가 아니라 libhaheho.so 를 찾는다. 최종적으로 main 이라는 실행 파일이 생성된다.
그러나 다음과 같이 libhaheho.so를 찾을 수 없다는 에러가 발생한다.
$ gcc -Wall -o main main.c -lhaheho
/usr/bin/ld: cannot find -lhaheho: No such file or directory
collect2: error: ld returned 1 exit status
2.3.1. Telling GCC where to find the shared library
다음과 같이 gcc에게 -L 옵션을 통해서 libhaheho.so의 위치를 알려주면 정상적으로 build 과정이 마무리 된다.
$ gcc -Wall -o main main.c -lhaheho -L/home/haheho/src
3. Execute
실행 또한 마찬가지로 libhaheho.so를 찾지 못한다는 에러가 발생한다.
이를 해결하기 위한 방법으로는 아래의 3가지가 존재한다.
$ ./main
./main: error while loading shared libraries: libhaheho.so: cannot open shared object file: No such file or directory
3.1. Using LD_LIBRARY_PATH
LD_LIBRARY_PATH에 library가 들어있는 path를 추가하는 것이다.
환경변수로 등록하는 것이기 때문에 사용자마다 각자 다른 환경을 갖고 있을 수 있다.
$ export LD_LIBRARY_PATH=/home/haheho/src
$ ./main
haheho
3.2. Using rpath
rpath를 사용하여 실행시 라이브러리를 찾기위한 경로 정보를 컴파일 시점에 추가할 수 있다.
이 정보는 LD_LIBRARY_PATH 보다 먼저 참고된다.
단, 고정된 path이기 때문에 유연성이 떨어진다.
$ unset LD_LIBRARY_PATH
$ gcc -Wall -o main main.c -lhaheho -L/home/haheho/src -Wl,-rpath=/home/haheho/src
$ ./main
haheho
$ readelf -d main | grep PATH
0x000000000000001d (RUNPATH) Library runpath: [/home/haheho/src]
3.3. Using ldconfig
system wide 하게 설정되는 환경이기 때문에 사용하기 편리하다.
단, 설정을 위해서 ld.so.conf 파일의 수정이 필요하며, 수정 후 ldconfig 명령을 통해서 캐시를 updqte 해야 사용이 가능하다.
$ gcc -Wall -o main main.c -lhaheho -L/home/haheho/src
$ echo "/home/haheho/src" > /etc/ld.so.conf.d/haheho.conf
$ ldconfig
$ ldconfig -v | grep haheho
/home/haheho/src: (from /etc/ld.so.conf.d/haheho.conf:1)
libhaheho.so -> libhaheho.so
$ ./main
haheho
'Development > Linux' 카테고리의 다른 글
Ubuntu 설치 후 기본적으로 해야 하는 작업을 Script로 설정하기 (0) | 2022.06.11 |
---|