説明
この記事はLuaのバイトコードの先頭にあるHeaderブロックにどのような情報が含まれているかを、Luaのバージョンごとに集めてあります。(ver 5.4以降は記載がありませんが、以下参考文献のgithubを見ていただければ自力で探すことが可能と考えます。)
注意
Luaのバイトコードは仕様が明文化されてきたわけではないため、例えばマイナーバージョンごとに仕様が異なる可能性もあります(調べた範囲ではそのような言及は見られませんでしたが。)
またこれは記事を読む上での注意事項ですが、ブロックの先頭バイトをアドレス0x01ではなく0x00として記載しているため、C言語の配列のように0x01は2番目のバイトになります。
参考文献 (special thanks to...)
- https://nymphium.github.io/pdf/tsukubalua.pdf
- https://nymphium.github.io/pdf/tsukubapm3-luavm.pdf
- https://openpunk.com/pages/lua-bytecode-parser/
-
github:lua/ldump.cのdumpheader関数 ←一番確実なソース
- これはLua v5.4だが、他のバージョンでもDumpHeader関数を参照すればheaderの中身はわかる。
- このファイル自体かなりバイトコードを読む上では重要で、例えばDumpFunction関数にはFunctionを格納する際にどのようなバイト列が生成されるかが書いてある。(DumpHeader関数と見比べれば読み方はわかるはず...)
Lua ByteCode header (Lua v5.1)
最初の12バイト (0x00-0x0a) がヘッダー。
ソース
Lua ByteCode header (Lua v5.2)
最初の18バイト (0x00-0x11) がヘッダー。
例)1B 4C 75 61 52 00 01 04 08 04 08 00 19 93 0D 0A 1A 0A
- 0x0000-0x0003 (4bytes):シグネチャ(ASCII文字で"\Lua")
- これによりLuaがbytecodeであると解釈する
- 0x0004 (1byte):Luaのバージョン。上記例では0x52なので5.2を表す。
- 0x0005 (1byte):フォーマットのバージョン:0x00=official。他はないはず。
- 0x0006 (1byte):エンディアンフラグ(0x00=ビッグエンディアン、0x01=リトルエンディアン)
- 0x0007 (1byte):sizeof(int)
- 0x0008 (1byte):sizeof(size_t)
- 0x0009 (1byte):sizeof(Instruction)
- 0x000a (1byte):sizeof(lua_Number)
- 0x000b (1byte):整数フラグ(0 = 整数を少数として保持(デフォルト), 1 = 整数型として保持)
- 0x000c-0x0011 (4bytes):テスト用データ --> 0x19939D9A(LUAC_DATA)
Lua ByteCode header (Lua v5.3)
最初の33バイト (0x00-0x20) がヘッダー。
例)1B 4C 75 61 53 00 19 93 0D 0A 1A 0A 04 04 04 08 08 78 56 00 00 00 00 00 00 00 00 00 00 00 28 77 40
- 0x0000-0x0003 (4bytes):シグネチャ(ASCII文字で"\Lua")
- これによりLuaがbytecodeであると解釈する
- 0x0004 (1byte):Luaのバージョン。上記例では0x53なので5.3を表す。
- 0x0005 (1byte):フォーマットのバージョン:0x00=official。他はないはず。
- 0x0006-0x000b (6bytes):テスト用データ。みんな同じで0x19939D9A1A0A(LUAC_DATA)
- 0x000c (1byte): sizeof(int)
- 0x000d (1byte): sizeof(size_t)
- 0x000e (1byte): sizeof(Instruction)
- 0x000f (1byte): sizeof(lua_Interger)
- 0x0010 (1byte): sizeof(lua_Number)
- 0x0011-0x0018 (8bytes): 整数変換テスト用データ --> 0x785600..00 (リトルエンディアンなので実体は0x5678)
- 0x0019-0x0020 (8bytes): 少数変換テスト用データ --> 0x00..287740(IEEE754倍精度, 実体は370.5)