当前位置: 首页 > article >正文

【WebAssembly 】WebAssembly 组成部分详解(0~12 段 ID 详解)

WebAssembly 二进制文件由多个段Section组成每个段有唯一的ID。本文详细介绍 ID 0-12 共 13 个标准段的完整结构。一、文件整体结构一个.wasm文件的结构如下------------------ 0x00 | 魔数 (4 字节) | \0asm ------------------ 0x04 | 版本号 (4 字节) | 1 ------------------ 0x08 | 段 0 (Custom) | ------------------ | 段 1 (Type) | ------------------ | 段 2 (Import) | ------------------ | 段 3 (Function) | ------------------ | 段 4 (Table) | ------------------ | 段 5 (Memory) | ------------------ | 段 6 (Global) | ------------------ | 段 7 (Export) | ------------------ | 段 8 (Start) | ------------------ | 段 9 (Element) | ------------------ | 段 10 (Code) | ------------------ | 段 11 (Data) | ------------------ | 段 12 (DataCount)| ------------------二、段通用格式每个段遵循相同的编码格式------------------ | 段 ID (1 字节) | 0x00 ~ 0x0C ------------------ | 段长度 (LEB128) | 该段的总字节数变长编码 ------------------ | 段内容 (N 字节) | 具体数据 ------------------LEB128 编码变长整数编码小端序最高位表示是否还有后续字节。三、段 ID 详解段 0Custom Section自定义段ID:0x00自定义段用于存储调试信息、名称、工具链元数据等不影响语义解析器可跳过。结构------------------ | 段名称长度 | LEB128 ------------------ | 段名称 | UTF-8 字符串 ------------------ | 自定义数据 | 任意二进制 ------------------常见子类型名称说明name函数名、局部变量名调试用sourceMappingURLSource Map 映射producers工具链信息编译器、版本WAT 示例(module;; 自定义段命名函数(customname\01\00\01\00\01\00add\00)(func$add(parami32 i32)(resulti32)(i32.add(local.get0)(local.get1))))段 1Type Section类型段ID:0x01定义函数签名类型供后续段引用。结构------------------ | 类型数量 | LEB128 ------------------ | 类型 0 | | -------------- | | 类型形式 (0x60)| 函数类型标记 | -------------- | | 参数数量 | LEB128 | -------------- | | 参数类型列表 | 每个 1 字节 | -------------- | | 返回值数量 | LEB128 (0 或 1) | -------------- | | 返回值类型 | 1 字节如果有 | -------------- | 类型 1 | ... ------------------数据类型编码类型字节值i320x7Fi640x7Ef320x7Df640x7Cv1280x7Bfuncref0x70externref0x6FWAT 示例(module(type(func(parami32 i32)(resulti32)));; 类型索引 0(type(func(paramf64)(resultf64)));; 类型索引 1(type(func));; 类型索引 2)二进制解析01 ; 段 ID: Type 09 ; 段长度: 9 字节 03 ; 3 个类型 60 02 7F 7F 01 7F ; 类型0: func(i32,i32)-i32 60 01 7C 01 7C ; 类型1: func(f64)-f64 60 00 00 ; 类型2: func()-void段 2Import Section导入段ID:0x02声明从外部环境导入的函数、全局变量、内存、表格。结构------------------ | 导入数量 | LEB128 ------------------ | 导入 0 | | -------------- | | 模块名长度 | LEB128 | -------------- | | 模块名 | UTF-8 | -------------- | | 名称长度 | LEB128 | -------------- | | 名称 | UTF-8 | -------------- | | 导入类型 | 1 字节 | -------------- | | 类型描述 | 根据导入类型决定 | -------------- | 导入 1 | ... ------------------导入类型编码类型字节值描述内容Function0x00类型索引 (LEB128)Table0x01表格类型Memory0x02内存类型Global0x03全局类型WAT 示例(module(importenvlog(func$log(parami32)));; 导入函数(importenvmemory(memory1));; 导入内存(importenvtable(table10funcref));; 导入表格(importenvcounter(global$counter(muti32)));; 导入全局变量)段 3Function Section函数段ID:0x03声明模块内部的函数只存储函数签名索引函数体在 Code 段。结构------------------ | 函数数量 | LEB128 ------------------ | 函数 0 类型索引 | LEB128 ------------------ | 函数 1 类型索引 | LEB128 ------------------ | ... | ------------------WAT 示例(module(type(func(parami32 i32)(resulti32)));; 类型 0(type(func(parami32)(resulti32)));; 类型 1(func(type0)...);; 函数 0使用类型 0(func(type1)...);; 函数 1使用类型 1(func(type0)...);; 函数 2使用类型 0)段 4Table Section表格段ID:0x04定义函数表格用于间接调用。结构------------------ | 表格数量 | LEB128 ------------------ | 表格 0 | | -------------- | | 元素类型 | 1 字节 (0x70 funcref, 0x6F externref) | -------------- | | 限制类型 | 1 字节 (0x00 最小, 0x01 最小最大) | -------------- | | 最小大小 | LEB128 | -------------- | | 最大大小 | LEB128 (如果限制类型为 0x01) | -------------- | 表格 1 | ... ------------------WAT 示例(module(table10funcref);; 最小 10无最大(table$t2520funcref);; 最小 5最大 20)段 5Memory Section内存段ID:0x05定义线性内存单位页1页 64KB。结构------------------ | 内存数量 | LEB128 ------------------ | 内存 0 | | -------------- | | 限制类型 | 1 字节 (0x00 最小, 0x01 最小最大) | -------------- | | 最小页数 | LEB128 | -------------- | | 最大页数 | LEB128 (如果限制类型为 0x01) | -------------- | 内存 1 | ... ------------------WAT 示例(module(memory1);; 初始 1 页无上限(memory$mem2210);; 初始 2 页最大 10 页)段 6Global Section全局段ID:0x06定义全局变量。结构------------------ | 全局变量数量 | LEB128 ------------------ | 全局变量 0 | | -------------- | | 类型 | 1 字节 (0x7F i32, 0x7E i64, ...) | -------------- | | 可变性 | 1 字节 (0x00 const, 0x01 var) | -------------- | | 初始值 | 常量表达式 | -------------- | 全局变量 1 | ... ------------------常量表达式支持的指令i32.const/i64.const/f32.const/f64.constglobal.get仅导入的全局变量ref.null/ref.funcWAT 示例(module(global$answer i32(i32.const42));; 常量(global$counter(muti32)(i32.const0));; 可变(global$ptr(muti32)(i32.const0));; 指针)段 7Export Section导出段ID:0x07声明对外暴露的接口函数、全局变量、内存、表格。结构------------------ | 导出数量 | LEB128 ------------------ | 导出 0 | | -------------- | | 名称长度 | LEB128 | -------------- | | 名称 | UTF-8 | -------------- | | 导出类型 | 1 字节 | -------------- | | 内部索引 | LEB128 | -------------- | 导出 1 | ... ------------------导出类型编码类型字节值Function0x00Table0x01Memory0x02Global0x03WAT 示例(module(func$add ...)(memory$mem1)(global$version i32(i32.const1))(table$tbl10funcref)(exportadd(func$add))(exportmemory(memory$mem))(exportversion(global$version))(exporttable(table$tbl)))段 8Start Section启动段ID:0x08指定模块实例化后自动执行的函数无参数、无返回值。结构------------------ | 启动函数索引 | LEB128 ------------------WAT 示例(module(func$init(call$setup))(start$init);; 实例化后自动执行 $init)段 9Element Section元素段ID:0x09初始化表格Table中的函数引用。结构------------------ | 元素段数量 | LEB128 ------------------ | 元素段 0 | | -------------- | | 表格索引 | LEB128 (通常为 0) | -------------- | | 偏移表达式 | 常量表达式计算起始索引 | -------------- | | 元素类型 | 0x00 funcref, 0x01 externref | -------------- | | 元素数量 | LEB128 | -------------- | | 函数索引列表 | LEB128 数组 | -------------- | 元素段 1 | ... ------------------WAT 示例(module(table10funcref)(func$add ...)(func$sub ...);; 初始化表格前 2 个槽位(elem(i32.const0)$add $sub);; 使用偏移表达式(elem(i32.const5)$add $sub $mul))段 10Code Section代码段ID:0x0A存储函数体实际指令序列。结构------------------ | 函数数量 | LEB128 (必须与 Function 段数量一致) ------------------ | 函数 0 | | -------------- | | 函数体大小 | LEB128 | -------------- | | 局部变量数量 | LEB128 | -------------- | | 局部变量组 | 每组的 (数量, 类型) | -------------- | | 指令序列 | 字节码 | -------------- | 函数 1 | ... ------------------局部变量编码------------------ | 局部组数量 | LEB128 ------------------ | 组 0 | | -------------- | | 变量数量 | LEB128 | -------------- | | 变量类型 | 1 字节 | -------------- | 组 1 | ... ------------------WAT 示例(module(func$add(param$a i32)(param$b i32)(resulti32)(local$temp i32);; 1 个局部变量(local$x i32)($yi32);; 2 个局部变量可合并(local.set $temp(i32.add(local.get $a)(local.get $b)))(local.get $temp)))段 11Data Section数据段ID:0x0B初始化线性内存中的数据。结构------------------ | 数据段数量 | LEB128 ------------------ | 数据段 0 | | -------------- | | 内存索引 | LEB128 (通常为 0) | -------------- | | 偏移表达式 | 常量表达式计算起始地址 | -------------- | | 数据长度 | LEB128 | -------------- | | 数据内容 | 原始字节 | -------------- | 数据段 1 | ... ------------------WAT 示例(module(memory1);; 静态字符串(data(i32.const0)Hello, World!);; 二进制数据(data(i32.const100)\00\01\02\03);; 命名数据段(data$message(i32.const200)Welcome))段 12Data Count Section数据计数段ID:0x0C可选段预先声明 Data 段的数量用于批量内存操作指令的验证。结构------------------ | 数据段数量 | LEB128 ------------------用途支持memory.init和data.drop指令时需要此段。WAT 示例(module(memory1)(data$d1(i32.const0)hello)(data$d2(i32.const10)world);; 编译器自动生成 DataCount 段值为 2)四、完整示例从 WAT 到二进制WAT 源代码(module;; 类型段(type(func(parami32 i32)(resulti32)));; 导入段(importenvlog(func$log(parami32)));; 函数段(func$add(type0)(local.get0)(local.get1)i32.add);; 导出段(exportadd(func$add));; 代码段;; (由编译器自动生成))十六进制表示00 61 73 6D ; 魔数 01 00 00 00 ; 版本 1 01 ; 段1: Type 07 ; 长度 7 01 ; 1个类型 60 ; 函数类型 02 ; 2个参数 7F 7F ; i32, i32 01 ; 1个返回值 7F ; i32 02 ; 段2: Import 0C ; 长度 12 01 ; 1个导入 03 ; 模块名长度 3 65 6E 76 ; env 03 ; 名称长度 3 6C 6F 67 ; log 00 ; 导入类型: Function 00 ; 类型索引 0 03 ; 段3: Function 02 ; 长度 2 01 ; 1个函数 00 ; 类型索引 0 07 ; 段7: Export 07 ; 长度 7 01 ; 1个导出 03 ; 名称长度 3 61 64 64 ; add 00 ; 导出类型: Function 00 ; 函数索引 0 0A ; 段10: Code 09 ; 长度 9 01 ; 1个函数 07 ; 函数体长度 7 00 ; 0个局部变量组 20 00 ; local.get 0 20 01 ; local.get 1 6A ; i32.add 0B ; end五、段 ID 总结表ID名称必选说明0Custom否调试信息、名称1Type是函数签名定义2Import否导入项3Function是有内部函数时函数签名索引4Table否表格定义5Memory否内存定义6Global否全局变量7Export否导出项8Start否启动函数9Element否表格初始化10Code是有内部函数时函数体11Data否内存初始化12DataCount否数据段计数用于批量操作顺序要求除 Custom 段外所有标准段必须按 ID 递增顺序出现Custom 段可以出现在任意位置通常放在开头或结尾

相关文章:

【WebAssembly 】WebAssembly 组成部分详解(0~12 段 ID 详解)

WebAssembly 二进制文件由多个段(Section) 组成,每个段有唯一的 ID。本文详细介绍 ID 0-12 共 13 个标准段的完整结构。 一、文件整体结构 一个 .wasm 文件的结构如下: ------------------ 0x00 | 魔数 (4 字节) | \0asm ---…...

Win11 WSL2下CentOS9-Stream保姆级安装指南:从零配置到Docker实战

Win11 WSL2下CentOS9-Stream保姆级安装指南:从零配置到Docker实战 对于需要在Windows环境下进行Linux开发的用户来说,WSL2(Windows Subsystem for Linux 2)无疑是一个革命性的工具。它允许开发者在Windows系统上运行原生的Linux二…...

单细胞数据分析避坑指南:如何用Seurat V5搞定细胞周期矫正与双胞体过滤

单细胞数据分析避坑指南:如何用Seurat V5搞定细胞周期矫正与双胞体过滤 单细胞RNA测序技术正在彻底改变我们对复杂生物系统的理解能力。当您第一次拿到单细胞测序数据时,可能会被细胞周期效应和双胞体污染这两个"隐形杀手"所困扰——它们悄无声…...

OSM道路数据里的‘fclass’字段到底怎么用?一份给GIS新手的标签解读与筛选指南

OSM道路数据里的‘fclass’字段到底怎么用?一份给GIS新手的标签解读与筛选指南 当你第一次打开从OpenStreetMap下载的道路数据,面对属性表中密密麻麻的"fclass"字段分类,是不是感到一头雾水?作为GIS领域最常用的开源数据…...

光电经纬仪与AI:能捕获隐身战机的“最后一瞥”吗?

引言 在现代防空体系中,光电经纬仪作为一种高精度光学测量设备,一直扮演着“记录者”与“验证者”的角色。它能够以极高的精度测量空中目标的轨迹,并记录下清晰的光学图像。然而,当面对像F-35这样的第五代隐身战机时,…...

腾讯:揭示评估幻觉并构建知识驱动新范式

📖标题:Beyond the Illusion of Consensus: From Surface Heuristics to Knowledge-Grounded Evaluation in LLM-as-a-Judge 🌐来源:arXiv, 2603.11027v1 🌟摘要 LLM-as-a-judge的范式依赖于一个关键假设,即…...

【图形图像处理】之栅格化:从原理到实时渲染的引擎核心

1. 为什么游戏和VR离不开栅格化? 第一次接触栅格化这个概念时,我正试图在Unity里实现一个简单的3D场景。当时发现无论模型多复杂,最终显示在屏幕上的永远是由无数小像素组成的画面。这个将矢量图形转换为像素矩阵的过程,就是栅格化…...

科技伦理兜着岐金兰

科技伦理兜着岐金兰引言当前,人工智能技术的迅猛发展正深刻重塑着人类社会的权力结构和话语体系。在这一背景下,科技伦理作为调节技术发展与社会价值的重要机制,其话语建构过程本身就蕴含着复杂的权力博弈。岐金兰在其系列文章中敏锐地捕捉到…...

避坑指南:ESP32-S3 Flash加密后,如何用Flash下载工具重新烧录固件?

ESP32-S3 Flash加密后固件更新实战:Release模式下的救砖指南 当ESP32-S3芯片开启Flash加密(特别是Release模式)后,常规的固件烧录方法将完全失效。这给产品迭代和bug修复带来了巨大挑战。本文将深入剖析加密机制背后的原理&#x…...

美团:融合先验与稀疏采样的自适应基线

📖标题:V0.5:Generalist Value Model as a Prior for Sparse RL Rollouts 🌐来源:arXiv, 2603.10848v1 🌟摘要 在具有可验证奖励的强化学习(RLVR)中,构建稳健的优势基线对…...

ROS2 编译依赖缺失的排查与修复指南

1. ROS2编译依赖缺失的典型表现 第一次用ROS2编译功能包时,看到满屏红色报错确实容易懵。最常见的就是CMake哭着告诉你"找不到某某包",就像你去超市买酱油却发现货架空空如也。这种报错通常长这样: CMake Error at CMakeLists.txt:…...

记忆走私犯:倒卖富豪脑数据的暗网暴富术——软件测试从业者的技术警示与防御蓝图

脑数据走私的崛起与技术危机2026年初,暗网曝出富豪思维记录以每秒计价拍卖,单条记忆数据标价高达250万美元,这标志着脑数据走私已成为新型犯罪风口。脑机接口(BCI)技术的普及让神经数据成为“数字黄金”,但…...

Nunchaku FLUX.1 CustomV3效果展示:多角色互动场景中姿态/光影/透视一致性保障

Nunchaku FLUX.1 CustomV3效果展示:多角色互动场景中姿态/光影/透视一致性保障 1. 引言:当AI绘画遇上复杂场景 你有没有试过让AI画一张多个人物互动的图?比如两个人在咖啡馆聊天,或者一群朋友在公园里野餐。结果常常让人哭笑不得…...

如何通过Jar包快速集成工作流设计器?

1. 为什么需要Jar包集成工作流设计器? 在企业级应用开发中,工作流引擎就像交通信号灯控制系统。想象一下,如果没有红绿灯,城市交通会乱成什么样子?工作流引擎就是帮我们管理业务流程的"红绿灯系统"。 传统集…...

本科毕业论文写作效率革命:Paperzz 智能写作,让毕业创作告别熬夜内耗

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿paperzz - 毕业论文-AIGC论文检测-AI智能降重-ai智能写作https://www.paperzz.cc/dissertation 一、引言:当 AI 重构本科毕业论文写作,毕业季的效率壁垒被彻底打破 对于每一位本科毕…...

leetcode 1451. Rearrange Words in a Sentence 重新排列句子中的单词

Problem: 1451. Rearrange Words in a Sentence 重新排列句子中的单词 先抠出单词,然后按照题意排序,最后拼起来 Code class Solution { public:string arrangeWords(string text) {text ;int n text.size(), cnt 0, ind, start 0;string tg;char…...

全连接神经网络 , 详解 .

用矩阵形式理解全连接网络偏置矩阵:训练完成后,每个神经元的偏置项 b 会学习到一个具体的数值。这个数值的作用是控制神经元激活的“阈值”,或者说为模型的输出提供一个“基准线”。在线性变换 z Wx b 中,偏置 b 实现了对决策边界的平移&am…...

1.军用涡扇发动机本体结构与能量转换底层逻辑

本文 100% 遵循全球航空工程通用标准、国内 GJB 国军标规范,所有术语、定义、流程逻辑、参数均符合现役军用加力式涡扇发动机的设计、使用与维护标准。要理解全流程工作原理,首先要明确发动机的核心结构与能量转换的本质,所有工况、系统、控制…...

密码学实战:如何利用生日攻击破解数字签名

1. 从生日悖论到数字签名攻击 我第一次听说生日攻击这个概念时,感觉特别有意思。想象一下,如果一个教室里只有23个人,那么其中两个人生日相同的概率就超过50%。这个反直觉的现象就是著名的生日悖论,而它在密码学领域有着惊人的应用…...

linux中从零开始,将OpenClaw 接入 QQ 机器人

Linux 从零开始:将 OpenClaw 接入 QQ 机器人 本文提供完整的 OpenClaw 安装和 QQ 机器人接入指南,适用于 Debian 12 系统,模型使用华为云提供MAAS 📋 目录 系统准备安装 OpenClaw配置 QQ 机器人测试与验证常见问题 &#x1f680…...

OpenClaw+GLM-4.7-Flash自动化数据处理:Excel报表生成实例

OpenClawGLM-4.7-Flash自动化数据处理:Excel报表生成实例 1. 为什么选择这个工具组合 上周处理季度销售数据时,我经历了从多个渠道手动收集数据、清洗格式、计算指标再到生成可视化报表的全过程。这种重复性工作不仅耗时,还容易在复制粘贴时…...

OpenClaw 刚启动就挂了?别急,八成是你的环境变量没弄对!

刚折腾完 OpenClaw 正打算爽一把,结果控制台直接蹦出一堆红字 Error: Configuration failed?或者好不容易跑起来了,一问大模型就回你 Missing API Key?先稳住!根据 2026 年的最新反馈,十个启动失败的里有九…...

jsontop.cn 深度测评:从 JSON 格式化到全能工具集,开发者的效率革命

在开发者的日常工作中,「琐碎的小需求」往往会占据大量的时间:比如接口返回的 JSON 数据杂乱无章,需要格式化才能查看;比如需要将文本转换为 Base64 编码,却要临时找在线工具;比如编写了正则表达式&#xf…...

Python基于深度学习的声音识别青少年防沉迷系统【附源码、文档说明】

博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...

Linux 数据链路层

1.数据链路层的作用简单来说。TCP协议实现的是数据传输的可靠性,IP协议实现的是数据能跨主机送达目标主机的能力,数据链路层保证相邻的两台设备进行数据交互的问题。2.以太网以太网的帧格式如下所示:目的地址和源地址都是 mac 地址&#xff0…...

【鸿蒙PC命令行移植适配】rsync 三方库鸿蒙化适配后在鸿蒙PC运行的完整实践

欢迎加入 开源鸿蒙跨平台开发者社区,与大家一起共建鸿蒙化 C/C 三方库生态。 1. 前言 本教程面向 C/C 开发者,带你完成 rsync 三方库的鸿蒙平台适配,并能够在鸿蒙PC上进行验证。 通过本教程,你将掌握: 使用 lycium…...

华为FusionCompute:从虚拟化基石到云数据中心智能引擎

1. 华为FusionCompute的进化之路:从虚拟化到智能引擎 第一次接触华为FusionCompute还是在五年前的一个数据中心改造项目上。当时客户的需求很简单——把二十多台老旧服务器整合成虚拟化环境。说实话,那时候的FusionCompute给我的印象就是个不错的虚拟化工…...

SQL Server 学习

SQL Server 是微软公司提供的一款关系型数据库。由于C#也是微软官方提供的语言,所以我们C#可以直接连接SQL Server使用,而不需要其他导入文件。一. SQL 概述1.1 语法关键字不区分大小写。多行或单行书写,用;结尾。可使用空格缩进增…...

Qwen3.5-9B行业应用:建筑图纸关键信息提取+自然语言说明生成

Qwen3.5-9B行业应用:建筑图纸关键信息提取自然语言说明生成 1. 项目概述 Qwen3.5-9B是阿里云推出的新一代多模态大模型,在建筑行业图纸处理领域展现出强大的应用潜力。该模型基于unsolth/Qwen3.5-9B架构,通过Gradio Web UI提供服务&#xf…...

Qwen-Image镜像效果展示:RTX4090D运行Qwen-VL完成图像情感分析与文案生成

Qwen-Image镜像效果展示:RTX4090D运行Qwen-VL完成图像情感分析与文案生成 1. 开箱即用的专业AI环境 当拿到这台搭载RTX4090D显卡的工作站时,我原本以为要花上大半天时间配置环境。没想到这个Qwen-Image定制镜像让我直接跳过了所有繁琐的安装步骤&#…...