shared library관련 기초적인 질문...
글쓴이: eminency / 작성시간: 토, 2003/03/08 - 1:07오전
컴파일 해서 공유 라이브러리를 만들 때...
-shared 옵션과 함께 주는 -fpic와 -fPIC 옵션이 의미하는 것이 무엇인지 둘의 차이점이 무엇인지 알고 싶습니다.
그리고 만들어진 공유 라이브러리를 사용해서 코드를 컴파일한 뒤 실행하려고 하면 공유 라이브러리를 찾을 수 없다고 나오는데 공유 라이브러리는 정적 라이브러리랑 달리 항상 /lib나 /usr/lib등 ldconfig로 지정된 라이브러리 디렉토리에 존재하지 않으면 사용할 수 없는 것인가요?
Forums:
object file을 만들때, 그 안의 symbol (function,
object file을 만들때, 그 안의 symbol (function, variable)들이 어떤 위치에 있어도 동작을 하는 구조로 compile 하라는 것입니다.
그렇게 된 것만이 so file에 들어 갈 수 있는 것이지요.
-fpic -fPIC 는 저도 차이는 경험하지 못했는데, 아마 object 의 크기와 관련된 것 같습니다.
LD_LIBRARY_PATH 라는 환경변수안에 들어 있기만 하면,
동적 library loader (ld)가 읽어 들입니다.
export LD_LIBRARY_PATH
LD_LIBRARY_PATH=.
하신뒤에 같은 디렉토리에 넣고 실행하세요.
---
http://coolengineer.com
(1) -fpic와 -fPIC - 둘의 차이점.KLDP 문서 중에 인
(1) -fpic와 -fPIC - 둘의 차이점.
KLDP 문서 중에 인용합니다.
"코드를 생성하기 위해 -fPIC이나 -fpic을 사용하라. 코드를 생성하기 위해 -fPIC이나 -fpic을 사용하는 것은 타겟에 따라서 다르다. -fPIC을 사용하는것은 언제나 동작한다. 하지만, -fpic을 사용하는 것보다 큰 코드를 생성할 것이다(PIC은 더 큰코드를 위한것이라서 더 많은 양의코드를 만든다는 것을 기억하라). -fpic옵션은 작고 빠른 코드를 만든다. 하지만, 전역심볼이나 코드의 크기 같은 것에서 플랫폼에 독립적이다. 링커는 공유 라이브러리를 만들때 이 옵션이 맞는지 말해줄 것이다. 어느것을 써야 할지를 모를때, 나는 언제나 동작하는 -fPIC을 선택한다"
원 문서는 http://kldp.org/HOWTO/html/Program-Library-HOWTO/ 입니다.
(2) library loader 가 shared object를 찾는 순서.
1) 링크시 -rpath 옵션으로 준 디렉토리, 혹은 -L 옵션으로 지정한 shared object
2) ldconfig로 지정한 디렉토리
3) LD_LIBRARY_PATH 에 지정된 디렉토리
이러한 순서로 찾는것으로 알고 있는데요... preload 관련해서는 정확히 잘 모르겠구요.
-rpath 이나 -L 옵션의 경우 다른 기계로 옮길때 문제가 발생할 수 있어서 개인적으로는 꺼리는 방법입니다.
LD_LIBRARY_PATH는 많은 유닉스 시스템에서 작동하지만, HPUX나 AIX에서는 다른 환경변수를 사용해야 합니다.
우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자
댓글 달기