2012-09-12 3 views
1

저는 작업중인 매우 특이한 문제가 있습니다. 솔라리스 8/sparc 플랫폼에 이전 컴파일러 (gcc 2.95 또는 이전 버전)로 컴파일 된 코드가 있습니다. 그것은 solaris 8/sparc에서 잘 실행되지만 solaris 10/sparc에서 충돌합니다. (솔라리스 10 솔라리스 8 이전 버전과 호환 가능)Solaris 8-10 : host2ip 변환 문제

디버깅에서 응용 프로그램이 해당 i/p 주소로 호스트 이름을 변환하려고하면 문제가 발생하는 것을 알 수 있습니다. gethostbyname_r을 사용하고 inet_ntoa를 사용하여 ipv4 quad dotted number를 얻습니다. gdb를 통해 솔루션을 통해 gethostbyname_r에 의해 반환 된 in_addr이 i/p 주소를 나타내는 올바른 정수를 갖지만 inet_ntoa 호출은 잘못된 형식의 문자열을 반환한다는 것을 알게되었습니다. 이 inet_ntoa 실패 정말 것을 확인에 하나의 어려움은 코드가

strcpy(hostaddr, inet_ntoa(*((struct in_addr *) hostdata.h_addr))); 

그래서 기술적으로 내가 inet_ntoa에 의해 반환 된 값을 볼 수 없습니다 아래와 같은 기록이다. 그러나 나는 (충분히 내가 감히 가까이있는)을 볼 수 GDB에

print (char*)inet_ntoa(*((struct in_addr *) hostdata.h_addr_list[0])) 

을 할 수 있으며, 그것은 잘못된 I/P 주소를 인쇄합니다. 예 : "0.0". (호스트 이름은 유효한 i/p 주소를 가지고 있기 때문에 해당 기계에서 확인할 수 있으므로 0.0으로 시작하는 i/p도 올바른 값이 아닙니다.)

inet_ntoa에서 안전하지 않은 strcpy를 사용하면 알 수 없으며 세그멘테이션 오류가 발생합니다.

이와 비슷한 inet_ntoa 오류의 원인과 비슷한 것을 경험 한 사람의 이야기를 듣는 것이 좋을 것입니다. 어떻게 든 시스템은 역할을 수행하고 있으며,이를 해결하기 위해 수행 할 수있는 일을 생각하기까지는 정확히 알 수 없습니다.

모든 댓글을 크게 감상하실 수 있습니다.

제약 조건 : 코드가 작동하도록 수정할 수 없습니다 (그렇지 않으면 해결하기가 쉽지 않음). 그래서 strcpy가 매우 안전하지 않은 함수라는 것을 알고 있음에도 불구하고 inet_ntoa는 더 이상 사용되지 않습니다. 저는 그 전선에서 무력합니다.

편집 : 나는 병렬 처리 문제라고 생각합니다. 확실하지는 않지만 응용 프로그램이 멀티 스레드라고 생각하지 않습니다. 그러나 새로운 sol10 머신은 64 코어 머신입니다. 생각 사슬의 이유는 inet_ntoa의 유일한 실제 문제는 정적 버퍼이며 코드는 루프에서이 호출을 수행한다는 것입니다.

+0

당신은 "나는 솔라리스 10/sparc 플랫폼에 오래된 컴파일러 (gcc 2.95 또는 그 이상)로 컴파일 된 코드가 있습니다."라고 썼습니다. "솔라리스 8/sparc 플랫폼". 그렇지 않으면 코드가 Solaris 8에서 작동하지 않습니다. – jlliagre

+0

감사와 수정 :) – IDK

답변

0

나는 링커 (그리고 나쁜 코드 - 코스)가 문제라는 것을 알았다. 표준 라이브러리 함수 (inet_ntoa_r)와 완전히 같은 이름으로 함수를 작성하는 것이 좋습니다. 코드를 라이브러리와 연결하는 동안 -static 옵션을 사용하려고 시도했을 때 사용자 라이브러리 파일에이 심볼이 있는지 불평하기 시작했습니다. 사용자 라이브러리에서이 함수를 제거하면 해당 크래시에서 다른 문제로 이동했습니다. 다른 문제가 예상됩니다. :)). 누군가 유용하다고 생각합니다.