GCC 2.96->3.2 이후 JNI 실행시 undefined symbol: __dso_han
Redhat 7.x ( 7.3 기준 gcc-2.96-110, binutils-2.11.93.0.2-11 ) 까지만해도
잘 실행하던 환경을 Redhat 8.0 ( gcc-3.2-7, binutils-2.13.90.0.2-2 ) 로 옮겼습니다.
C++로 된 API 와 연결된 Java 프로그램( JNI-Java Native Interface 를 사용하는 GUI ) 를
실행시키니 Shared Object (*.so) 로딩시 undefined symbol: __dso_handle 에러가 뜨더군요...
C++ API 는 GCC 2.96 에서 3.2 대로 옮기면서 에러가 나서
namespace 와 STL 쓰는 부분을 약간 수정했는데,
JNI 쪽도 비슷한 문제려니하고 한동안 고민(?) 좀 했습니다만 잘 모르겠더군요...ㅠ_ㅠ
그래서, 웹사이트를 뒤져보니 비슷한 문제가 gcj 의 FAQ 에 있었습니다...
-----------------------------------------------------------------------------------
http://korea.gnu.org/gcc/gcc-3.1/gcj/gcj-faq.ko.html#4_6 의 내용...
데비안 리눅스 포테이토에 포함된 GNU 링커와 같은 몇몇 버전은
`.hidden' 지시어(directive)에 대한 지원이 빠져있는데,
이 경우 최신 버전의 gcc로 빌드된 공유 라이브러리를 사용하는데 문제가 발생할 수 있습니다.
다음과 같은 3가지 해결 방법이 있습니다.
(1) .hidden을 전혀 지원하지 않는 버전으로 binutils 꾸러미를 다운그레이드 합니다.
(2) binutils 꾸러미를 최신 버전으로 업그레이드 합니다.
(3) gcc의 auto-host.h 파일에 정의된 HAVE_GAS_HIDDEN을 undef으로 처리한 뒤에
gcc를 다시 빌드합니다. (이 파일은 configure를 수행한 직후에 자동으로 생성됩니다.)
-----------------------------------------------------------------------------------
이중 (1)과 (2)는 시도하여 C++ API를 리빌드해 봤습니다만 효과가 없었고,
( Redhat 7.x 의 binutils 버젼을 써보기도 하구, Redhat 9 에서도 해보구,
최신꺼 다운받아서도 해봤습니다. 더욱 이전 버젼은 시도해 보지 않았습니다.)
(3)을 시도하자니 앞으로 실험/판매할 모든 플랫폼의 GCC를 사용자 빌드버젼으로
교체해야한다는 막막한(?) 상황에 직면했습니다. 물론 (1) 이나 (2)가 성공했다 해도 비슷하지만요...ㅡ_ㅡ;;
혹시 (3)을 쓰지않고 이 문제를 해결하는 방법을 아시는 분이 계시다면 도움을 바라겠습니다...
더불어 혹시 제가 잘못 생각하고 있는 부분이 있다면 지적해 주시기 바랍니다...(__)
Re: 자답...ㅡ_ㅡ;;;
binutils 의 ld 로 *.so 를 만들지 않고
g++ -shared 로 *.so 를 만드니 되는군요...
관련 글: http://sources.redhat.com/ml/bug-binutils/2003-q1/msg00059.html
잠시 괜한 소란을 피운듯...^^;;;
댓글 달기