关于lua字节码在32位和64位系统上不兼容的问题

作者:游蓝海
文章链接:http://blog.csdn.net/you_lan_hai/article/details/77430116

问题

使用32位的lua虚拟机编译出来的字节码,无法被64位的lua虚拟机识别。反过来也一样不能识别。

原因

实际上,主要问题出现在了序列化上。因为lua在读/写字节码的时候,有两个地方使用到了size_t类型变量来存贮长度,一个是读/写字符串,一个是文件头部的size_t长度校验。而size_t是平台密切相关的,size_t类型变量的字节数和指针变量的字节数相等(sizeof(size_t) = sizeof(void*p)),因此在32、64位的系统上各不相同。

经过测试,将序列化和反序列化过程中涉及到的size_t类型换成uint32_t,在32和64位虚拟机输出的字节码就完全一样了。

目前尚不清楚,lua虚拟机在序列化时为何使用size_t而不是uint32_t来表示长度。

相关文件

  1. 加载字节码文件:lundump.c
  2. 写入字节码文件:ldump.c

将这两个文件中,涉及到存档的size_t,换成uint32_t或者LUAI_UINT32

注意

  1. 该方法不适用于兼容16位机器。在16位机器上sizeof(int)可能为2,所以跟32和64位机器差别就非常大了,要改动的地方就比较多了。
  2. 该方法也不适用于luajit。因为我没看过luajit源码,不确定如何去修改。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值