2017-04-19 1 views
1

32 비트 시스템에서 잘 실행되는 오래된 TCL 스크립트가 있지만 64 비트 시스템에서 '분할 오류'가 발생했습니다.이 스크립트는 다음과 같습니다.TCL 스크립트는 C-API에서 반환 된 64 비트 포인터를 유지할 수 없습니다.

***********  headerGet: 0x7f86ab50edb0 
***********  setAnswerMessageHeader, cmd=0x337c950, cmdFlags=0, hdr=0xffffffffab50edb0 
,617 : 여기
static MsgHeader_t currHeader; 

MsgHeader_t * 
headerGet(void) 
{ 
    printf("***********  headerGet: %p\n", &currHeader); 
    return &currHeader; 
} 

int 
setAnswerMessageHeader(Msg_t * cmd, W8 cmdFlags, MsgHeader_t * hdr) 
{ 
    printf("***********  setAnswerMessageHeader, cmd=%p, cmdFlags=%d, hdr=%p\n", cmd, cmdFlags, hdr); 

    ... 

    return RETURN_OK; 
} 

64 비트 시스템 내 디버그 출력 :
... 
set msgHeader [ headerGet ] 
setAnswerMessageHeader $cmd 0x00 $msgHeader 
... 

여기 headerGet 및 setAnswerMessageHeader이 같다 C-API에 있습니다

그래서 문제는 : headerGet은 msgHeader 변형에 주소 0x7f86 ab50edb0을 반환하지만 TCL이 setAnswerMessageHeader에 전달할 때 주소가 완전히 잘못되었습니다. addess의 마지막 4 바이트 (0x ab50edb0) 만 유지되는 것처럼 보입니다. 첫 번째 두 개 (0x7f86)는 (는)입니다.

은 BTW : 내 TCL 버전 8.5

내가 TCL/TK와 unfamliar 생각입니다. 왜 이런 일이 일어나고 그것을 고치는지를 아는 사람이 있습니까?

+0

C++ 코드와 Tcl 코드 사이에 바인딩 계층을 만들기 위해 무엇을 사용하고 있습니까? 그게 버그가있는 곳이기 때문에 묻습니다. –

+1

It 's SWIG. 내 env에서 체크하고 그것이 32 비트라는 것을 알았다. 어쩌면 그게 원인 일 수도 있습니다. 나는 그것을 업데이트하고 다시 달릴 것이다. 실제로 나에게 방향을 제시하는 'ask'에 감사드립니다. –

답변

0

문제는 사용중인 SWIG의 빌드에서 포인터를 32 비트 값으로 처리한다는 점입니다 (중요한 비트를 버립니다). 포인터가 올바르게 매핑되도록 64 비트 인식 코드를 생성해야 함을 이해하려면 SWIG가 필요합니다.

+0

답장을 보내 주셔서 감사합니다. SWIG에서 64 비트 인식 코드를 생성하는 방법에 대해 알고 싶습니다. –

관련 문제