Estructura general del fragmento (cabeza)
El fragmento binario se divide principalmente en dos partes:
Puede utilizar el comando xxd para observar el archivo luac
1. Encabezado
Encabezado *** ocupa 30 subsecciones (varía según la plataforma)
Contiene:
a. Firma
Muchos formatos binarios comenzarán con una magia fija. número (Número mágico) Inicio
(archivo de clase Java, el número mágico es de cuatro bytes 0xCAFEBABC)
El número mágico (también llamado firma) del fragmento binario de Lua también consta de cuatro palabras Sección Los códigos son los códigos ASCII de ESC, L, u y a respectivamente.
La representación hexadecimal es 0x1B4C7561 y la cadena es \x1bLua
Su función principal es identificar rápidamente el archivo. Función de formato
Cuando la máquina virtual Lua intenta cargar un archivo fragmentado y descubre que no comienza con esto, se negará a cargar el archivo
Número de versión
. p>Un byte después de la firma registra el número de versión de Lua correspondiente al archivo binario
Consta de tres partes:
Número de formato
Después del número de versión, una subsección de registra el número de formato del fragmento binario
Cuando Lua carga un fragmento binario, también verificará el número de formato
Si no coincide con el formato número de la máquina virtual, se negará a cargar el archivo
El número de formato utilizado oficialmente por Lua es 0
d.LUAC_DATA
Los seis. los bytes después del número de formato se denominan LUAC_DATA en la implementación oficial de Lua
Los dos primeros caracteres son 0x1993, que es el año en que se lanzó Lua 1.0
Las últimas cuatro subsecciones son: carro El carácter de retorno (0x0D), el carácter de avance de línea (0x0A), el carácter de reemplazo (0x1A) y otro carácter de nueva línea
también se utilizan para la verificación si la máquina virtual encuentra que estos seis bytes son diferentes al cargar el binario. trozo, pensará que el archivo está dañado y se negará a cargar
e. ancho de instrucción de la máquina virtual Integer y Lua
Los siguientes números registran los cinco tipos de datos de cint, size_t. , Instrucción de máquina virtual Lua, número entero Lua y número de punto flotante Lua, que están prohibidos por Microsoft. El número de bytes ocupados en el fragmento.
También se comprobará el número de bytes ocupados por estos cinco tipos de datos. Si no coincide con el valor esperado, se rechazará la carga
f.LUAC_INT
.Analizado La subsección n almacena el valor entero de Lua 0x5678
para verificar el modo big-endian del fragmento binario, Lua usará la máquina virtual para cargar el fragmento binario y usará estos datos para. compruebe si el modo big-endian coincide con el nativo. Si no coincide, el registro será rechazado
g.LUAC_NUM
Las últimas n subsecciones del encabezado almacenan Lua. número de punto flotante 370.5
También se usa para detectar binarios. El formato de punto flotante usado por el fragmento, se niega a cargar si no coincide
(las plataformas y lenguajes principales generalmente usan el formato de punto flotante IEEE 754)