TCL 脚本无法保留从 C-API 返回的 64 位指针
TCL script cannot keep the 64bit pointer returned from C-API
我有一个在 32 位机器上运行良好的旧 TCL 脚本,但是在 64 位机器上得到 'Segmentation fault' machine.The 脚本是这样的:
...
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 returns 地址0x7f86ab50edb0 到msgHeader 变体,但是当TCL 将它传递给setAnswerMessageHeader 时,地址完全错误。看起来只保留了地址的最后四个字节 (0xab50edb0)。 前两个 (0x7f86) 丢失。
顺便说一句:我的 tcl 版本是 8.5
我不熟悉TCL/TK。有谁知道为什么会发生这种情况以及如何解决它?
问题出在您正在使用的 SWIG 构建中,因为它将指针视为 32 位值(丢弃了那些有效位)。您需要 SWIG 了解它必须生成 64 位感知代码,以便正确映射指针。
我有一个在 32 位机器上运行良好的旧 TCL 脚本,但是在 64 位机器上得到 'Segmentation fault' machine.The 脚本是这样的:
...
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 returns 地址0x7f86ab50edb0 到msgHeader 变体,但是当TCL 将它传递给setAnswerMessageHeader 时,地址完全错误。看起来只保留了地址的最后四个字节 (0xab50edb0)。 前两个 (0x7f86) 丢失。
顺便说一句:我的 tcl 版本是 8.5
我不熟悉TCL/TK。有谁知道为什么会发生这种情况以及如何解决它?
问题出在您正在使用的 SWIG 构建中,因为它将指针视为 32 位值(丢弃了那些有效位)。您需要 SWIG 了解它必须生成 64 位感知代码,以便正确映射指针。