TCL脚本无法保持从C-API返回的64位指针

时间:2017-04-19 06:14:10

标签: tcl swig 32bit-64bit

我有一个旧的TCL脚本,它在32位机器上运行良好,但在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时,地址完全错误。看起来只保留了addess的最后四个字节(0x ab50edb0 )。 前两个(0x7f86)丢失

BTW:我的tcl版本是8.5

我对TCL / TK不感兴趣。有没有人知道为什么会发生这种情况以及如何解决它?

1 个答案:

答案 0 :(得分:0)

问题在于您正在使用的SWIG的构建,因为它将指针视为32位值(抛弃那些有效位)。您需要SWIG了解它必须生成64位感知代码,以便正确映射指针。