Development/Linux

LInux에서 Shared Library 만들기

HahEHO 2022. 8. 14. 18:48
728x90

공유라이브러리는 정적 라이브러리와 다르게 실행시에 로드되는 라이브러리를 의미한다. 피일 확장자는 대부분 .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

 

반응형