본문 바로가기
Development/Linux

LInux에서 Shared Library 만들기

by HahEHO 2022. 8. 14.
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

 

반응형