C로 프로그램을 하다 보면 정적 라이브러리 외에 동적 라이브러리를 사용해야 하는 경우가 있다.
보통의 경우 /etc/ld.so.conf에 경로를 저장해 놓거나
LD_LIBRARY에 경로를 설정해 놓는다.
이 방법의 단점은 사용자가 동적 라이브러리 경로를 직접 설정해줘야하는 것이다.
이런 번거로움을 손쉽게 해결하는 방법으로 rpath를 이용할수 있다.
rpath를 설정하기 전에 간단히 사전 지식을 설명하면
동적 라이브러리에 어떤 정보로 빌드가 되었는지 확인할때 쓰는 명령어가 있다.
ELF 파일을 읽는 방법인데
readelf -d so파일명
정상적으로 빌드가 되었으면 아래와 같이 보일 것이다.( 아래 so 파일은 autotools로 빌드하였다. )
Dynamic section at offset 0x2420 contains 21 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000e (SONAME) Library soname: [libtest.so]
0x000000000000000c (INIT) 0xbe0
0x000000000000000d (FINI) 0x1ea8
0x000000006ffffef5 (GNU_HASH) 0x158
0x0000000000000005 (STRTAB) 0x668
0x0000000000000006 (SYMTAB) 0x230
0x000000000000000a (STRSZ) 578 (bytes)
0x000000000000000b (SYMENT) 24 (bytes)
0x0000000000000003 (PLTGOT) 0x2025e0
0x0000000000000002 (PLTRELSZ) 528 (bytes)
0x0000000000000014 (PLTREL) RELA
0x0000000000000017 (JMPREL) 0x9d0
0x0000000000000007 (RELA) 0x928
0x0000000000000008 (RELASZ) 168 (bytes)
0x0000000000000009 (RELAENT) 24 (bytes)
0x000000006ffffffe (VERNEED) 0x908
0x000000006fffffff (VERNEEDNUM) 1
0x000000006ffffff0 (VERSYM) 0x8aa
0x000000006ffffff9 (RELACOUNT) 1
0x0000000000000000 (NULL) 0x0
반면에 수작업으로
gcc -Wall -g -shared -Wl,-soname, libtest.so -o libtest.so file1.o file2.o
처럼 빌드하면
Dynamic section at offset 0x2e20 contains 21 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000e (SONAME) Library soname: []
0x000000000000000c (INIT) 0xa28
0x000000000000000d (FINI) 0x2758
0x000000006ffffef5 (GNU_HASH) 0x158
0x0000000000000005 (STRTAB) 0x5a0
0x0000000000000006 (SYMTAB) 0x240
0x000000000000000a (STRSZ) 533 (bytes)
0x000000000000000b (SYMENT) 24 (bytes)
0x0000000000000003 (PLTGOT) 0x202ff0
0x0000000000000002 (PLTRELSZ) 288 (bytes)
0x0000000000000014 (PLTREL) RELA
0x0000000000000017 (JMPREL) 0x908
0x0000000000000007 (RELA) 0x830
0x0000000000000008 (RELASZ) 216 (bytes)
0x0000000000000009 (RELAENT) 24 (bytes)
0x000000006ffffffe (VERNEED) 0x800
0x000000006fffffff (VERNEEDNUM) 1
0x000000006ffffff0 (VERSYM) 0x7b6
0x000000006ffffff9 (RELACOUNT) 1
0x0000000000000000 (NULL) 0x0
'C언어' 카테고리의 다른 글
multi process read (0) | 2013.08.08 |
---|---|
warning: passing argument of discards qualifiers from pointer target type (0) | 2013.07.30 |
[autotools] libtool link 옵션 (0) | 2013.04.01 |
"configure: error: C++ preprocessor "/lib/cpp" fails sanity check" (0) | 2013.01.29 |
automake & autoconf (0) | 2012.06.18 |