LuaJit分析(三)luajit字节码文件格式

news2024/9/27 19:21:45

Luajit字节码文件格式的完整信息如上图所示,包括文件头Header和原型Proto,一个原型可以对应lua源码中的一个函数或源文件。
一、文件头
文件标志:占用三个字节,始终是0x1B4C4A,表示这是一个luajit文件
版本:占用一个字节,最新版2.1.0-beta3显示为2
Flags标志:占用一个字节,官方定义为:

#define BCDUMP_F_BE   0x01
#define BCDUMP_F_STRIP    0x02
#define BCDUMP_F_FFI    0x04
#define BCDUMP_F_FR2    0x08

BE表示是否大端对齐,默认0表示小端对齐
STRIP表示是否去除调试信息,0表示没去除,包含调试信息
FFI表示是否有调用外部C函数库
FR2表示是否使用开启了FR2,64位模式编译时FR2 = 1
文件名大小(STRIP=0):源文件名占用的字节大小
文件名(STRIP=0):源文件名

二、原型
1、原型头
原型大小:uleb128类型,表示整个原型占用字节大小,为0标志结束
原型flags标志:定义如下:

#define PROTO_CHILD   0x01  /* Has child prototypes. */
#define PROTO_VARARG    0x02  /* Vararg function. */
#define PROTO_FFI   0x04  /* Uses BC_KCDATA for FFI datatypes. */
#define PROTO_NOJIT   0x08  /* JIT disabled for this function. */
#define PROTO_ILOOP   0x10  /* Patched bytecode with ILOOP etc. */

第一位proto_child定义是否是一个子函数,即闭包
第二位proto_vararg 函数是否返回多个值
第三位 proto_ffi 是否使用了扩展
第四位proto_nojit标志是否禁用了jit模式
第五位 proto_iloop标志是否有iloop循环指令
参数个数:函数有几个参数
Frame大小:使用栈帧的大小
upvalue个数:使用外部函数中变量的个数
复杂常量个数:
数值常量个数:
指令个数:
调试信息大小(STRIP=0):后面调试信息占用字节的大小
起始行(STRIP=0):原型的在文件中的起始行
行数(STRIP=0):原型占用的总行数
2、原型体
指令:原型的字节码指令,每条指令占四个字节,默认对齐时,第一个字节为opcode,
个数为原型头中的指令个数
Upvalues:upvalue,uint16,个数为原型头中指定的个数
复杂常量:保存了多种类型的常量,定义如下: 

typedef struct {
uleb128 tp;
MSize constant_type = uleb128_value(tp);
if (constant_type >= BCDUMP_KGC_STR) {
int32 len = constant_type - BCDUMP_KGC_STR;
char str[len]
} else if (constant_type == BCDUMP_KGC_TAB) {
Table t;
} else if (constant_type != BCDUMP_KGC_CHILD) {
TNumber num;
if constant_type == BCDUMP_KGC_COMPLEX:
            Tnumber num;
} else {
prototype val = prototypes.pop();
}
}ComplexConstant

第一个uleb128表示这个复杂常量的类型,如下:

enum {
BCDUMP_KGC_CHILD = 0,
BCDUMP_KGC_TAB = 1,
BCDUMP_KGC_I64 = 2,
BCDUMP_KGC_U64 = 3,
BCDUMP_KGC_COMPLEX = 4,
BCDUMP_KGC_STR = 5
};

主要包括了字符串,数值,table 和 child (prototype自身)
Table定义如下:

typedef struct {
uleb128 array_items_count;
uleb128 hash_items_count;
local int32 array_items_count_ = uleb128_value(array_items_count);
local int32 hash_items_count_ = uleb128_value(hash_items_count);
while (array_items_count_-- > 0) {
ArrayItem array_item;
}
while (hash_items_count_-- > 0) {
HashItem hash_item;
}
} Table;

HashItem定义如下:

typedef struct {
ComplexConstant key;
ComplexConstant value;
} HashItem;

数值常量:保存数值类型的常量,可以表示整数和浮点数,定义如下:

typedef struct {
uleb128_33 lo;
if (lo.val[0] & 0x1)
uleb128 hi;
} NumericConstant;

调试信息(STRIP=0):包括三个部分,定义如下:

typedef struct{
if (debuginfo_size > 0) {
LineInfo lineinfo(lines_count, instructions_count);
if (upvalues_count > 0)
UpValueNames upvalue_names(upvalues_count);
VarInfos varinfos;
}
} DebugInfo

Lineinfo记录了每条指令所在的行,upvalue_names记录了upvalue的字符串信息,varinfos记录了每个变量的字符串,定义如下:

typedef struct(uchar tp) {
local uchar tp_ = tp;
if (tp >= VARNAME__MAX) {
string str;
} else {
VARNAME_TYPE vartype;
}
if (tp != VARNAME_END) {
uleb128 start_addr;
uleb128 end_addr;
}
} VarInfo;

Varinfo记录了变量的类型,以及变量作用域的起始行和结束行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2088657.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

006-Sleuth(Micrometer)+ZipKin分布式链路追踪

这里写目录标题 1 分布式链路追踪概述1.1 为什么会出现这个技术?需要解决哪些问题?1.2 在分布式与微服务场景下需要解决的问题 2 新一代Spring Cloud Sleuth:Micrometer2.1 官网重要提示2.1.1 新一代Sleuth2.1.2 官网2.1.3 说明2.1.3.1 老项目…

性能测试计划怎么写?

一.简介 简介部分就不用过多描述了,无非是项目的背景,进行此次性能测试的原因,以及性能测试覆盖的范围等等,几乎所有项目文档都在开端对项目进行简单的阐述。 二.性能测试需求 寻找的被测试对象和压力点…

SD-WAN 跨国专线主要应用在哪些地方?

随着企业需求的不断变化和发展,传统的WAN技术已无法完全满足现代企业的需求。因此,SD-WAN跨国专线逐渐成为企业连接全球业务的重要选择。SD-WAN跨国专线通过SD-WAN技术,实现跨国业务的高效专线连接,极大地提升了企业的全球运营能力…

泡泡玛特2024半年报发布:收入利润高增长 各项指标超预期

泡泡玛特发布2024上半年业绩报告。报告显示,2024年上半年泡泡玛特国际集团实现营收45.6亿元(人民币,下同),同比增长62.0%,经调整后净利10.2亿元,同比增长90.1%。国内地市场差异化渠道定位及精细化运营驱动其业务实现营…

分类预测|基于Transformer-LSTM的数据分类预测Matlab程序 多特征输入多类别输出

分类预测|基于Transformer-LSTM的数据分类预测Matlab程序 多特征输入多类别输出 文章目录 一、Transformer-LSTM基本原理1. 模型原理TransformerLSTM 2. 流程步骤1. 数据预处理2. Transformer编码器3. LSTM层4. 分类层5. 模型训练与评估 3. 优势与应用 二、实验结果三、核心代码…

【原创教程】电气电工14:电磁阀知识一篇搞定

电气电工这些知识点,我们描述的比较细,虽然看起来比较简单,但是它是后面我们技能提升的基础,如果我们后面学电气工程师相关知识,这些都属于基本功。 接着我们来看一下电磁阀。 电磁阀是一种利用电磁原理控制流体介质方向、流量、压力等参数的控制元件。它是将电信号转化…

安装Ubuntu

1.看到如下直接回车(安装) 2.选择语言 3.有的版本会叫你更新(1.更新2.不用继续安装3.返回) 4.键盘选择(一般默认即可回车) 5.Ubuntu版本选择 6.网路配置 7.代理服务器配置(不懂回车即可&#xf…

C语言教程-13_1-初识指针

title: C语言教程-13_1-初识指针 tags: [C] categories: C语言教程 description: 接触C语言的灵魂-指针 概要: 简要讲解内存地址与内存模型简单介绍C语言的指针这一数据类型掌握指针相关最基本的两种互逆运算 前置知识: 理解能力和想象能力耐心和实验精神数组与函数的知识 …

ES(Elasticsearch)可视化界面-浏览器插件

安装 支持Micrsoft Edge、谷歌、火狐浏览器 此处我以IE为例 使用 extension://aonamamifdfigcflbeokdndfappnmogo/es-client/index.html?td_channelidchrome#/more/about 输入相关连接信息即可 rest client语法 和kibana的开发者工具查询方式一致,可以参考我另一篇文章Kiba…

Python生成指定数量的随机XML文件

我的需求是随机生成18位数字的XML文件名,其中前12位数字是随机数,后6位是时间信息 其中XML中写入CSN的tag值,代码如下 import os import random import time import xml.etree.ElementTree as ETdef generate_random_filename():random_part…

光耦合器的简要揭秘

光耦合器,也称为光隔离器或光电耦合器,是电子器件中必不可少的元件,它提供了一种在电路隔离部分之间传输电信号的方法。这种隔离对于保护系统的敏感部分免受高压尖峰或电气噪声的影响至关重要,这使得光耦合器在许多应用中成为一种…

Linux内核编程(十四)IIC总线驱动FT5X06触摸屏

本文目录 前述:一、IIC子系统框架二、I2C设备驱动层1. i2c_client编写(C语言版-旧内核)2. i2c_client编写(设备树版-新内核) 前述: 对于IIC的基础知识,这里不做过多的介绍,详细情况…

智能地理信息系统平台应该是什么样子?

现在GIS平台除了三维GIS属于重大突破,这些年基本上都属于蹭热点概念,并在这些热点概念之间左右逢源,究其本质,还是在于没有把握好GIS的立足之本与用户之间的巨大鸿沟。回归到题目上,智能地理信息系统平台,从…

钣金展开计算工具【机械设计工具集】

一款非常实用的计算器工具,它可以帮助用户计算直角弯曲展开长度的工具,无需直角弯曲展开长度计算公式,选择对应的图形,输入已知的数据、查询α系数并输入,就可以快速计算出长度了! 方便钣金件下料长度的计算…

Uniapp:WebSocket 重连之后累加触发 uni.onSocketOpen()

省流 不要用 uni.xxx 那一套,用 socketTask await uni.connectSocket({}) 的 socketTask 去控制 业务逻辑描述 第一次进入应用主页,连接 WebSocket手机熄屏之后,断开当前连接的 WebSocket手机亮屏之后,再次进入应用后&#x…

SpringBoot异常处理原理分析

springboot默认机制 错误处理的自动配置都在ErrorMvcAutoConfiguration中,两大核心机制: SpringBoot 会自适应处理错误,响应页面或JSON数据 SpringMVC的错误处理机制依然保留,MVC处理不了,才会交给boot进行处理 发生…

《黑神话:悟空》一只横扫全球的中国“猴子”,这里也有!

这个夏天,除了火辣辣的太阳让人燥热难耐,还有一只横空出世的“猴子”让众多网友热血沸腾——8月20日,筹谋7年的首款国产现象级3A游戏大作《黑神话:悟空》,准时登录各大平台,期待已久的玩家们一饱“猴瘾”。…

2024年第四届《英语世界》杯全国大学生翻译大赛

2024年第四届《英语世界》杯全国大学生翻译大赛 第一场下周日开考! 一、参赛福利: 1、报名即可获得大赛专属题库、《英语世界》数字刊阅读权限、《英语世界》杯系列赛事公开课珍贵资料; 2、开展线上公开课邀请名师讲解; 3、获…

linux之网络子系统-MAC帧、数据报、段 的头部信息

一、MAC帧 格式 MAC帧是属于链路层,网卡发送数据的格式。 MAC帧主要有两种格式,一种是以太网V2标准,一种是IEEE 802.3,常用的是前者。 DMAC(Destination MAC)是目的MAC地址。DMAC字段长度为6个字节&#…

突破速度障碍:探索25MBd数字光耦合器在工业自动化中的作用

在快节奏的工业自动化世界中,对能够跟上高速运行同时保持可靠性和安全性的组件的需求至关重要。这些系统中最关键的组件之一是光耦合器,它在机器的不同部分或机器之间传输信号时提供电气隔离。25MBd数字光耦合器的推出代表了该领域的重大进步&#xff0c…