解析wasm二进制文件
[TOC]
文件内容
hello的源文件如下:
wat文件如下:
hello的wasm文件如下:
16进制读取结果为:
wasm-dump解析结果如下:
二进制解析
魔数和版本号
下面表格是wasm规格书中定义的code: 首先因为大小端问题,这里的存放和源文件是不同的,wasm的魔数为0x6d736100,版本号为0x01,所以前四个为魔数00 61 73 6d,后四个是版本号01 00 00 00,大小端颠倒了。
Type Section
接下来的数字是01 8a 80 80 80 00,01是type,表示函数签名的Type Section,后面的8a 80 80 80 00是LEB128编码方式表示长度为0a。 也就是:
02表示entries数量为2,60表示是个函数的签名,00表示参数为0,那么也就省略了param_types,01表示有一个返回值,7f表示返回值为i32类型,这个是main的函数声明; 同理,60 01 7f 01 7f表示一个带有i32类型并返回i32类型的函数声明,也就是Println的函数声明。
Import Section
再往下是02,表示Import Section, 长度为15, 02 8f 80 80 80 00,内容为:
01则只有一个引用,module长度为3,名称为env,field长度为7,名称为Println,最后的kind表示引入的类型,00表示引入的是个函数,01则表示函数的索引。
Function Section
然后是03,Function Section, 长度为82 80 80 80 00,内容为:
01表示签名索引数量为1,00表示在type区中的索引值为0,即main函数的签名。
Table Section
接下来是04, Table Section, 长度为84 80 80 80 00 ,内容为:
01表示数量为1,类型为70,目前只能是70,表示anyfunc。
Memory Section
05-Memory Section, 长度为83 80 80 80 00,内容为:
Global Section
06-Global Section, 长度为81 80 80 80 00,内容为:
Export Section
07-Export Section, 长度为91 80 80 80 00,内容为:
02表示export数量为2,06表示第一个entry长度,名称为memory,02表示类型为memory类型,index为00,表示在对应索引空间的索引值; 04表示第二个entry长度为4,名称为main,类型为00,function类型,索引为01
Code Section
下面就是Code Section了,中间的Start Section, Element Section在这个模块中没有体现: 0a-Code Section,长度为8f 80 80 80 00,内容为:
01表示数量为1,89 80 80 80 00表示size为9,00是locals数量,为0则locals就没有,41 10 10 00 1a 41 00是code,0b是end。
Data Section
0b-Data Section, 长度为92 80 80 80 00,内容为:
01表示数量为1,00表示在线性内存中的索引为0,41表示iConst.32, 10表示call操作码, 0b表示offset,0c表示参数长度为12,68 65 6c 6c 6f 20 77 6f 72 6c 64 00表示我们打印的内容为hello world 至此,文件解析完毕。
最后更新于