[질문] 동적 라이브러리를 검색 위치. (HP와 IBM) -추가 질문 있습니다. T_T
유닉스, 리눅스에서 동적라이브러리(so파일)을 만들 때,
A.so가 B.so를 사용한다면 빌드시에 링크를 하게 되지요.
그리고 A.so를 dlopen으로 로드할 때, A.so는 B.so를 검색하게 됩니다.
이 때 일반적으로 환경변수에 등록된 LD_LIBRARY_PATH를 찾게 되는데요.
저는 A.so가 B.so와 같은 path에 존재한다면
B.so가 비록 LD_LIBRARY_PATH에 존재하지 않더라도
dlopen("/home/fullpath/A.so") -> 즉 A.so의 Full Path로 로드하려고 할 때,
B.so가 로드되길 원합니다.
리눅스에서는 -Wl,-rpath,'$ORIGIN'
SUN에서는 -R '$ORIGIN'
가 이 역할을 하는데요.
HP에서는 이와 같은 역할을 하는 옵션으로-Wl,+b, '$ORIGIN'
가 있다고 들었는데 잘 작동하지 않아서 질문을 드립니다.
주요 옵션만 나열하자면
원래 저는 다음과 같이 링크를 했습니다.
aCC -AA +DD64 +DA2.0W -b -o A.sl -L../lib/ -lB objectfile.o
그런데 이렇게 링크를 하면
1) LD_LIBRARY_PATH
2) dlopen을 수행한 실행파일위치를 기준으로 ../lib/
이 두 위치만 찾더군요.
특히 이상한 점은 링크용 path를 지정한 -L../lib/ 가 runtime에도 영향을 준다는 점입니다.
그리고 앞서 말한 옵션을 활용해서
aCC -AA +DD64 +DA2.0W -b -o A.sl -L../lib/ -lB objectfile.o -Wl,+b, '$ORIGIN'
와 같이 링크하면 그나마도 제대로 작동하지 않더군요.
제 어려움에 대해서 도움을 주세요.
정리하자면
저는 B.so에 의존하는 A.so를 만들고 있고
어떤 실행파일로부터
dlopen("A.so의 full path")로 A.so를 로드하려고 합니다.
이 때, A.so와 B.so는 동일 위치에 있습니다.
그런데 이 path는 LD_LIBRARY_PATH가 아니라서 B.so를 로드하지 못하고 결과적으로 A.so마저 로드가 안되고 있는 것이죠.
이러한 경우를 위해, A.so에 B.so를 링크시킬 때, 동일 디렉토리를 검색하게 하는 옵션이 있는 것으로알고 있는데, 제대로 안되서 다시 한번 고수분들께 도움을 요청합니다.
P.S. IBM AIX에 대해서도 동일한 질문을 하고 싶습니다. T_T
linker의 옵션은 +b가 맞는것 같은데, aCC man page에서
linker의 옵션은 +b가 맞는것 같은데, aCC man page에서 linker에 넘기는 옵션도 gcc와 같이 -Wl 인가요? 확인해보세요.
그리고 전통적으로 HP는 SHLIB_PATH, AIX는 LIBPATH 를 사용하였습니다.
요즘 버전에서는 LD_LIBRARY_PATH도 지원하는것 같더군요.
---
http://coolengineer.com
[quote]*정리 11) Solaris Sparc => -
글쓰신 분의 질문 내용을 보니, 정리 1,2는 읽어보시면 대충 의미하는 바를 아실것으로 보이며, 이미 아실지도 ....
----------------------
환경이 미비해서 테스트를 제대로(gcc밖에는 없는지라 ) 해보지는 않았으나, 질문자의 질문과는 다소 차이나는 부분에 대해 답변을 해준적이 있었습니다.
그 내용을 올려드리겠습니다.
--------
발췌
* 동적링크에 관련해서 글을 정리해둔게 있는데, 찾기가 어려워서.... kldp에 올렸으면 찾기 좋았을텐데.. ㅎㅎ :oops:
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
재차 질문 T_T (이 문제에서의 '문제점'은)
'$ORIGIN'이 안먹는 것 같다는 점입니다.
다음과 같은 폴더구조가 있다고 하죠.
/exefolder/lib_folder/
그리고 실행파일 exe와 A.so, B.so가 있다고 할 때
1)
Wl,+b,'$ORIGIN' 없이 -L/exefolder/로 링크했을 때
exe는 /무조건 /exefolder/에서만 so를 찾는 것 같습니다.
exe는 어느 디렉토리에 넣던 상관없는 것 같고요.
2)
-Wl,+b,'$ORIGIN' 를 사용하면
exe는 전혀 so 파일을 못찾더군요.
3)
그래서 제가 한번
-Wl,+b,'.' 를 옵션으로 줘봤습니다.
그러자, exe는 무조건 exe가 존재하는 디렉토리에서만 (물론 LIB_PATH포함해서) 찾는 것 같더군요.
사실 제가 원하는 것은 A.so가 B.so를 필요로 할 때,
A.so와 B.so가 lib_folder에 있고 exe가 exefolder에 있다고 해도 exe가 A.so를 fullpath로 읽으들이면 A.so는 자기가 존재하는 디렉토리에 B.so가 있으면 load되는 것인데 말이죠.
(리눅스에서는 이렇게 되더군요. -rpath를 썼을 때.)
그래서 저의 의문점은
HP에서는 '$ORIGIN' 이 제대로 인식이 안되는게 아닌가 하는 것입니다. 다른 세팅이 선행되어야 하는지도 의심이 되고요.
-Wl,+b,'$ORIGIN' 를 사용하면 아예 로드를 못하니 더 답답하더군요.
고수님들의 많은 도움 부탁드려요. T_T
댓글 달기