作者:游蓝海
文章链接: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源码,不确定如何去修改。

转载于:https://www.cnblogs.com/ygxsk/p/7693961.html

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

  1. C++中int、long和double的取值范围和最大值,以及32位和64位的差异解读

    前言 一般对于C/C++下int等基本数字类型,主要关注三个维度,长度.取值范围和最大值的宏定义.下面分三个维度说明下. 有三个影响因素: 语言规则限制:比如int是变长,long是定长,double ...

  2. Java--位、字节、字符、字符编码、数据存储单位 电脑的32位和64位的区别是什么呢

    引言: 这里放一张Java语言数据类型帮助理解 1. 位(bit) 位(bit):是计算机 内部数据 储存的最小单位,11001100是一个八位二进制数. 2. 字节(byte) 是计算机中 数据处理 ...

  3. 【笔试题】C语言结构体中,不同的数据类型在32位和64位下所占字节的区别

    题目 如下C程序,在64位处理器上运行后sz的值是什么? struct st {int *p;int i;char a; }; int sz=sizeof(struct st); 答案 16 解析 考 ...

  4. 在32位、64位操作系统下各数据类型所占的字节数

    点击打开链接 在32位.64位系统当中,唯一改变的是指针的长度;在32位系统当中是4个字节.64位则是8个字节.所谓的32位.64位,这个指的是寄存器的位宽. 32位平台下结果: 64位平台下结果: ...

  5. 【源码】声明32位和64位Access、Excel等VBA兼容的API函数的方法

    1.在声明中加上  PtrSafe 关键字 2.加上VBA7 及Win64的判断 Declare 语句 PtrSafe 关键字(可参考VBA帮助) 带有 PtrSafe 关键字的 Declare 语句 ...

  6. 从编程角度看32位和64位

    ------------------------文章内容并非原创,看其他博主,有所收获,积累一二---------------------------------- 一)64位系统和32位有什么区别? ...

  7. C++工作笔记-32位和64位程序的区别

    原文地址: https://blog.csdn.net/nma_123456/article/details/45077345 文章结尾有对此博文的修正和补充! 由于操作系统内存分配的不同,导致软件开 ...

  8. linux环境下shellcode的编写:32位和64位

    linux环境下shellcode的编写 shellcode的理解 使用pwntools工具编写 自己实现更精炼的 32位shellcode 64位shellcode shellcode的理解   我 ...

  9. 32位dll注入到64位程序_你用的32位还是64位?有什么区别呢?

    (给程序员零距离加星标,了解项目开发.) 粉丝福利:小编会从今天留言中抽选3名小伙伴赠送现金红包,感谢大家一直以来的支持!文末见喽!通过前面两篇文章的学习,外甥对电脑的产生了各种好奇,差点把自己电脑拆 ...

  10. C++ 32位和64位

    C++32位和64位程序的区别 原文地址: https://blog.csdn.net/nma_123456/article/details/45077345 由于操作系统内存分配的不同,导致软件开发 ...

最新文章

  1. 初学php时一些术语以及一些基础知识
  2. 解决protobuf import路径的问题
  3. jmeter 逻辑控制器
  4. AS3图像抖动效果源码。
  5. jpa in查询_优选在shopee虾皮怎么发货价格查询皮皮虾云仓
  6. vue点击input框出现弹窗_vue组件实现弹出框点击显示隐藏效果
  7. Elasticsearch性能监控(一)
  8. SCI从入门到精髓(三)——如何写出牛文章
  9. DTD与XML的关系。。说的不错,拿来看看,学习了
  10. HttpUtils发送delete方法
  11. 百度云如何免费扩容至2055G?
  12. Microsoft Visio 专业版 2019,注意事项(bat文件乱码以及登不上Microsoft账号问题0x80190001)
  13. 自动驾驶 Apollo 源码分析系列,感知篇(三):红绿灯检测和识别
  14. *ST东方A:山重水复疑无路 强烈推荐评级
  15. Word制作表格常用操作
  16. 移动web开发rem+js适配布局开发
  17. C++ vector详细用法
  18. 全球与中国高分辨率三维X射线显微镜市场深度研究分析报告
  19. java 136年以后的时间_136年后 圣家族大教堂终于获得了建筑许可证
  20. linux系统如何修复分区工具,推荐一个Linux分区恢复工具Testdisk(Windows也能用)...

热门文章

  1. Egret入门学习日记 --- 第十篇(书中 2.9~2.13节 内容)
  2. sql server 安装时提示要重启
  3. (转载)应用层协议和传输层协议的关系
  4. 再见2012,你好2013,总结愿望
  5. ModelSim SE 6.5破解
  6. 用keil编译的时候遇到不能编译也不能build
  7. 微信棋牌程序搭建Redis持久化存储(AOF与RDB两种模式)
  8. base command
  9. mysql如何更新一个表中的某个字段值等于另一个表的某个字段值
  10. Android开发人员得让短信应用程序准备好迎接巧克力棒