Excuse the ads! We need some help to keep our site up.

List

Shared Library

설명

  • 공유 라이브러리는 여러 오브젝트 파일을 하나의 오브젝트 파일로 만들어 이를 공유할 수 있도록 한 것입니다.
    • 실행 파일에 라이브러리 함수 코드가 포함되는 것이 아니라 실행시 공유 라이브러리를 참조하는 방식으로 링크 됩니다.
    • 공유 라이브러리를 링크한 실행 파일을 실행할 경우에는 동적 링커 로더(ld.so)가 해당 실행 파일에서 필요한 공유 라이브러리를 찾아내어 실행시 해당 프로세스의 메모리 맵을 조작해서 공유 라이브러리와 실행 바이너리가 같은 프로세스 공간을 사용하도록 합니다.
    • 실제 라이브러리 코드는 실행 파일에 포함되어 있지 않고 공유 라이브러리에만 존재합니다.
    • 따라서 실행 파일을 배포할 때 실행 파일과 공유 라이브러리를 함께 배포해야 합니다.
    • 그렇지 않으면 실행 시 라이브러리를 찾을 수 없다는 에러 메시지가 나타납니다.

Example

Source code(Shared library)

test.c
#include <stdio.h>
 
void lazenca(int a){
    printf("lazenca.0x%d\n",a);
}

Source code(executable)

#include <stdio.h>

void main(){
    lazenca(10,10);
}

Build & Setting

Build shared library

Build Command(Shared library)
lazenca0x0@ubuntu:~/Documents/Definition/protection/PIC$ gcc -fPIC -shared -o libPIC.so lazenca.c

Setting shared library

  • 아래와 같이 ld.so.conf 파일을 설정합니다.
/etc/ld.so.conf
include /etc/ld.so.conf.d/*.confe
  • "/etc/ld.so.conf.d" 디렉토리 안에 libmy.conf라는 파일을 생성 후 아래와 같이 공유 라이브러리 파일(.so)의 전체 경로를 입력합니다.
/etc/ld.so.conf.d/libmy.conf
/home/autolycos/Documents/
  • 공유라이브러리를 다른 모든 실행파일 내에서 사용할 수 있도록 하기 위해 아래 명령어 실행 함으로 써 캐쉬를 갱신합니다.
ldconfig
$ sudo ldconfig

Build executable file

Build Command
lazenca0x0@ubuntu:~/Documents/Definition/protection/PIC$ gcc -o NonPIC test.c -lNonPIC -L.
test.c: In function 'main':
test.c:4:5: warning: implicit declaration of function 'lazenca' [-Wimplicit-function-declaration]
     lazenca(10,10);
     ^
lazenca0x0@ubuntu:~/Documents/Definition/protection/PIC$

Run

프로그램 출력 화면
lazenca0x0@ubuntu:~/Documents/Definition/protection/PIC$ ./NonPIC 
Lazenca.0x10
lazenca0x0@ubuntu:~/Documents/Definition/protection/PIC$ 

Check for shared library in the executable file

  • ldd(List Dynamic Dependencies)는 프로그램에서 요구하는 공유 라이브러리를 출력해 주는 프로그램입니다.
  • ldd를 이용하여 dynamic_test 프로그램에서 libmy.so라는 공유 라이브러리를 참조하는 것을 확인 할 수 있습니다.
ldd를 이용한 확인
lazenca0x0@ubuntu:~/Documents/Definition/protection/PIC$ ldd ./NonPIC 
	linux-vdso.so.1 =>  (0x00007fffb8fd9000)
	libNonPIC.so => /home/lazenca0x0/Documents/Definition/protection/PIC/libNonPIC.so (0x00007f866f6d3000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f866f309000)
	/lib64/ld-linux-x86-64.so.2 (0x0000564199d90000)
lazenca0x0@ubuntu:~/Documents/Definition/protection/PIC$

Without shared library

Error
lazenca0x0@ubuntu:~/Documents/Definition/protection/PIC$ ./NonPIC 
./NonPIC: error while loading shared libraries: libNonPIC.so: cannot open shared object file: No such file or directory
lazenca0x0@ubuntu:~/Documents/Definition/protection/PIC$

Related information

  • N/a

  • No labels