2013. 1. 28. 16:00
공유라이브러리 연습 C언어 이야기2013. 1. 28. 16:00
연습
http://mintnlatte.tistory.com/entry/%EA%B3%B5%EC%9C%A0-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EC%83%9D%EC%84%B1
-fPIC, -fpic 옵션(Position Independent Code)은 공유를 위한 위치 독립적 코드를 생성한다. 이 옵션을 붙이지 않고 컴파일하게 되면 실행은 되지만 실제로 공유가 되지 않는다.
-WI 옵션은 뒤에 오는 옵션들이 gcc를 거치지 않고 바로 링커(collect2)에게 전달되도록 해준다.
-soname 옵션은 만들어질 공유 라이브러리의 soname을 정하는 것이다. 이것은 파일 명과는 틀린 개념으로 지금과 같이 soname을 libmystuff.so.1이라고 이름을 지어주면 나중에 동적 링커가 공유 라이브러리를 찾을 때 libmystuff.so.1.0.0을 찾는게 아니라 soname인 libmystuff.so.1(libmystuff.so.1.0.0의 심볼릭 링크) 파일을 찾아서 링크하게 된다. 이런 식으로 사용하는 이유는 파일 명과는 상관없이 서로 다른 버전의 공유 라이브러리를 융통성 있게 사용하기 위해서이다. 1.0.0의 맨 앞 1은 메이저 버전이라하여 라이브러리에 중대한 변화가 발생했을 때 바뀌는 번호이다. 메이저 번호가 바뀌었다면 호환이 안된다는 의미와 같다. 그래서 메이저 버전이 틀린 라이브러리로 컴파일된 실행 파일은 같은 이름(mystuff)의 라이브러리가 있다고 하더라도 실행될 수 없다. 두 번째 0은 마이너 버전이며 약간의 변화에 의해 변화되는 번호이다. 마이너 버전이 바뀜으로해서 미치는 영향은 크지 않다. 마지막 0은 패치 버전이며 아주 사소한 변화가 생겼을 때 변하는 버전이다.
framework
include
cli
각각 폴더 생성
framework에 volume.c, container.c 만듬
include에 appAPI.h 만듬
cli에 main.c 만듬
framework에 있는 소스코드 컴파일하여 오브젝트로 만듬
-fPIC 옵션
gcc -fPIC -c volume.c
gcc -fPIC -c container.c
공유라이브러리 파일로 만듬(.so로 끝나야 하는 것 같음)
$cd lib
$gcc -shared -o libhooney.so ../framework/volume.o ../framework/container.o -lc
실행파일
$cd cli
$gcc -o main main.c -I../include -L../lib -lhooney
$ldd main
libhooney.so 찾을 수 없다고 나옴
왜?
ld가 아직 설정되지 않았다.
(2) library loader 가 shared object를 찾는 순서.
1) 링크시 -rpath 옵션으로 준 디렉토리, 혹은 -L 옵션으로 지정한 shared object
2) ldconfig로 지정한 디렉토리
3) LD_LIBRARY_PATH 에 지정된 디렉토리
/etc/profile을 열어서 마지막 하단에 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"/home/hoony/lib" 추가
$source /etc/profile
$./main
'C언어 이야기' 카테고리의 다른 글
이차원배열과 그 순회방법 (0) | 2013.03.30 |
---|---|
linux hlist 분석 (0) | 2013.02.09 |
int ** vs int (*)[] 이차원배열 (0) | 2012.12.18 |
rbtree insert (0) | 2012.12.11 |
rb 트리 (0) | 2012.12.11 |