달력

0

« 2025/4 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

'C언어 이야기'에 해당되는 글 15

  1. 2013.01.28 공유라이브러리 연습
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
:
Posted by НooпeУ


Code Start Code End