TCL脚本无法保留从C-API返回的64位指针
问题描述:
我有一个旧的TCL脚本,它在32位机器上运行良好,但在64位机器上出现“分段错误”。脚本如下:TCL脚本无法保留从C-API返回的64位指针
...
set msgHeader [ headerGet ]
setAnswerMessageHeader $cmd 0x00 $msgHeader
...
这里headerGet和setAnswerMessageHeader是C-的API,其是这样的:
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位机器上我的调试输出:
*********** headerGet: 0x7f86ab50edb0
*********** setAnswerMessageHeader, cmd=0x337c950, cmdFlags=0, hdr=0xffffffffab50edb0
所以,问题是:headerGet返回地址0x7f86 ab50edb0到msgHeader变体,但是当TCL将它传递给setAnswerMessageHeader时,地址是完全错误的。看起来只保留了该地位的最后四个字节(0x ab50edb0)。 前两个(0x7f86)丢失。
BTW:我的TCL版本是8.5
我unfamliar与TCL/TK。有没有人知道为什么发生这种情况,以及如何解决它?
答
问题在于你正在使用的SWIG的构建,因为它将指针视为一个32位值(它抛弃了那些重要的位)。您需要SWIG了解它必须生成64位感知代码,以便指针正确映射。
+0
感谢您的回复。任何想法如何让SWIG生成64位感知代码? –
你在使用C++代码和你的Tcl代码之间的绑定层是什么?我问,因为这是错误的地方... –
这是SWIG。我检查了我的env,发现它是32位的。所以也许是原因。我会更新它并再次运行。感谢你的“问”,这实际上给了我一个方向。 –