2011-08-04 13 views
0

sparc9 및 sparc10 시스템에 gcc 3.4.6이 설치되어 있습니다. sparc10에서 공유 객체 (sparc9 기반)를 사용하려고하면 호환성 문제가 발생합니다. sparc9 시스템에서 동일한 공유 객체를 사용하면 어떤 문제도 나타나지 않습니다. 메이크 파일에서 코드 조각 : - solaris sparc 9/10 libstdC++ compatibilty 문제 (64 비트)

LIB=-L/usr/lib/sparcv9 -L/usr/local/lib/sparcv9 -L/lib/sparcv9 
gcc -m64 -shared -fPIC -o myapi.so.1 myapi.o $(LIB) -lc -lstdc++ -luuid 

지금 sparc10에서 다음 -

ldd -d /home/myapi.so 
libstdc++.so.6 =>  /usr/local/lib/sparcv9/libstdc++.so.6 
symbol not found: _ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode    (./myapi.so) 

내가 정상 표시 위의 출력에서 ​​다른 종속성을 생략했다. .

그럼, 참조되지 않은 기호 위를 위해/usr/지방/lib 디렉토리/SPARCV9에 된 libstdc에 대한 "나노"++ so.6을 실행하고 다음과 같은 결론과 함께 제공 : -

V9---> _ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode 
V10--->_ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode 

주의 깊게 보면, sparc9 및 sparc10 ... "ExSt12"v/s "ElSt12"에서 맹 글링 된 이름 기호의 차이를 볼 수 있습니다.

마찬가지로 sparc10에 myapi.so를 빌드하면 V9 및 V10의 심볼 불일치로 인해 sparc9에서 실패합니다.

누군가 내가 누락 된 부분에 관해 도움이되는 힌트를 주실 수 있습니까? 또는 V9에 패키지를 설치해야합니까? V9에 내장 된 공유 객체가 V10에서 작동해야한다고 가정합니다.

나는 libstdC++의 크기가 있다고 덧붙이고 싶다 .V9의 so.6은 V10과 다르다. V9에는 SMCgcc가 있고 V10에는 SUNWgccruntime과 SMCgcc가 모두 있습니다.

답변

0

두 OS에 호환되지 않는 버전의 GNU C++ 컴파일러 & 표준 라이브러리를 사용하고있는 것처럼 보입니다. 안타깝게도 C++에 대한 표준 ABI가 없으며 많은 컴파일러가 주요 릴리스 (예 : Sun C++ 컴파일러 4.x vs 5.x 또는 g ++ 2.x v 3.x v 4.x)와 호환되지 않는 기호 맹 글링 규칙을 변경합니다).

/usr/local/lib 경로는 sunfreeware.com 사이트에서 다운로드 한 SMCgcc 패키지의 라이브러리를 사용한다는 것을 의미합니다. Solaris 9 및 10 시스템에서 버전이 일치하는지 확인하십시오.

+0

@ alanc..thanks이 문제에 대한 도움을 받으십시오. gcc/g ++ 버전은 두 컴퓨터 모두에서 3.4.6입니다. 그러나 gcc의 기본 "as"버전은 두 시스템에서 다릅니다. 솔라리스 10의 64 비트 SUNWgccruntime 패키지를 찾을 수 없습니다 (솔라리스 10의 기본 패키지입니다). 이 시나리오에서는 solaris 10에서 SMCgcc의 버전을 확인하고 solaris 9에서 동일한 버전을 설치해야합니까? 이 방법이 권장 되는가 아니면 다른 방향이어야 하는가? – confused

+0

SUNWgccruntime은 Solaris 10에 처음 추가 된 Solaris 번들 gcc 런타임입니다. Solaris 9 용으로 만들어진 적이 없었습니다. – alanc

1

그 기호로 분해 해제하는 방법 (Solaris 10이 더 "SPARC 10"입니다, 그래서 당신은 의미합니다) :

std::basic_streambuf<char, std::char_traits<char> >::seekoff(long long, std::_Ios_Seekdir, std::_Ios_Openmode) 

하나가 long 사용

std::basic_streambuf<char, std::char_traits<char> >::seekoff(long, std::_Ios_Seekdir, std::_Ios_Openmode) 

공지 것을

과 다른 용도 long long

그 중 하나는 64 비트 파일 오프셋 (별개로 대용량 파일 지원)을 사용하고 다른 하나는 그렇지 않은 것으로 의심됩니다. 즉, 두 버전의 GCC가 (sunfreeware.com 또는 다른 사람이 제공 한) 다르게 빌드되어 호환되지 않습니다.

관련 문제