给定一个.wasm文件,如何检查二进制编码的版本?
我一直在尝试使用WebAssembly,但是开始遇到据我所理解的版本控制问题,导致出现如下消息:
错误:Wasm.instantiateModule():Wasm解码失败结果=预期版本0c 00 00 00,找到0b 00 00 00 @ + 4
要么
错误:Wasm.instantiateModule():Wasm解码失败结果=预期版本0c 00 00 00,发现01 00 00 00 @ + 4
除了在不支持给定文件的WebAssembly嵌入程序上运行该错误以外,如何检查wasm文件的版本?
编辑:根据最近的发行说明,这是一个有时间限制的问题,所有组件的版本都将是0x1。
我目前正在尝试通过 LLVM 编译的 WebAssembly,但我还没有设法理解堆栈/堆栈指针以及它与整体内存布局的关系。
我了解到我必须使用s2wasmwith--allocate-stack N来使我的程序运行,我认为这基本上是添加(data (i32.const 4) "8\00\00\00")(N=8)到我生成的浪费中,二进制部分显然是指向内存偏移量的指针,而 i32 常量是它的线性存储器中的偏移量。
不过,我不太明白的是为什么指针的值是56(同样是 N=8)以及该值如何与内存中堆栈的确切区域相关,在我的例子中,当前看起来像:
0-3: zero
4-7: 56
7-35: other data sections
36-55: zeroes
56-59: zero
我知道我可能更适合“只使用 emscripten”,但我也想了解这一点。
我正在与我自己的 webAssembly JS 到 wasm 编译器的错误作斗争。我不确定尺寸格式是否正确以及限制是什么
例如127字节的数据段
00 41 00 0b 7f ...data
^^ size 127 bytes
Run Code Online (Sandbox Code Playgroud)
然后是128字节
00 41 00 0b 8001 ...data
^^^^ size 128
Run Code Online (Sandbox Code Playgroud)
我猜测高位如果打开表示后面将有一个字节。这意味着下一步将是
00 41 00 0b ff7f ...data
^^^^ size 16383
00 41 00 0b 808001 ...data
^^^^^^ size 16384
Run Code Online (Sandbox Code Playgroud)
因此,长度为 nibit 顺序(3 字节 6 nibit),103254其中 nibit 1 和 3 具有最高位设置,以便查看S1110000 S3332222 A5554444S 始终打开且 A 始终关闭的位,并且数字表示 nibit 位顺序。
这是正确的吗?这种格式可以表示的最大值是多少?
这是唯一的尺寸格式吗?
是否有一个标准算法可以从表示长度的 Javascript 数字转换为这种格式,因为目前我的解决方案看起来非常hacky?
我正在尝试在我的 TypeScript React 项目中使用wasm-clingo。我尝试d.ts为该项目编写自己的文件:
// wasm-clingo.d.ts
declare module 'wasm-clingo' {
export const Module: any;
}
Run Code Online (Sandbox Code Playgroud)
并像这样导入:
import { Module } from 'wasm-clingo';
Run Code Online (Sandbox Code Playgroud)
但当我console.log(Module)说undefined. 我做错了什么?
笔记:
我这样解决了这个问题:
// wasm-clingo.d.ts
declare module 'wasm-clingo' {
const Clingo: (Module: any) => Promise<any>;
namespace Clingo {}
export = Clingo;
}
Run Code Online (Sandbox Code Playgroud)
和
import * as Clingo from 'wasm-clingo';
Run Code Online (Sandbox Code Playgroud)
在 Enscripten 中,EM_ASM 函数内部的代码会发生什么?我的意思是该代码是否在运行时被编译或解释?如果编译,那么它在浏览器中是否比本地解释的 js 运行得更快或更慢?
我正在努力让 webpack 处理一组使用 wasm-bindgen 编译的WebAssembly 文件。
即使这可能只是 webpack 的一个问题,它也让我意识到我没有完全掌握这些古怪的 WebAssembly 工具之间的差异。
我能够将一个 int 类型(它是 SelectedDiagnosisIdList 列表的第一个元素)变量绑定到 html 选择的选定元素:
<div>
<label>Diagnosis:</label>
<div>
<select @bind="@userInfo.SelectedDiagnosisIdList[0]">
@foreach (var item in diagnoses)
{
<option value="@item.Id">@item.Name</option>
}
</select>
<p>@userInfo.SelectedDiagnosisIdList[0]"</p>
</div>
</div>
@code
{
List<int> SelectedDiagnosisIdList = new List<int>() { 0 };
List<Diagnosis> diagnoses; // populated from db in OnInitializedAsync
}
Run Code Online (Sandbox Code Playgroud)
这很好用,当我在 UI 上更改选定的值时,段落的值会发生变化。
现在,我想添加更多 Diagnoses,因此我尝试维护更多 s 并向 SelectedDiagnosisIdList 添加更多元素:
<div>
<label>Diagnosis:</label>
<div>
@for(int i = 0; i < userInfo.SelectedDiagnosisIdList.Count; i++)
<select @bind="@userInfo.SelectedDiagnosisIdList[i]">
@foreach (var item in diagnoses)
{
<option value="@item.Id">@item.Name</option>
}
</select>
<p>@userInfo.SelectedDiagnosisIdList[i]</p>
}
</div>
</div> …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 webassembly 流功能,但它不起作用。
我确实遵循了 WebAssembly 流的服务器配置的统一文档说明。
https://docs.unity3d.com/2019.3/Documentation/Manual/Webgl-Server-configuration-for-WebAssembly-streaming.html
我正在使用 Unity 2019.2.20f1
在 Unity 播放器设置中,我将压缩格式设置为 gzip 并启用 WebAssembly 流。
我将 .htaccess 文件添加到 Build 文件夹中。
以下是 .htaccess 文件的内容
<IfModule mod_mime.c>
AddEncoding gzip .unityweb
AddType application/wasm .wasm
AddEncoding gzip .wasm
AddOutputFilterByType DEFLATE application/wasm
</IfModule>
Run Code Online (Sandbox Code Playgroud)
我还补充说
application/wasm wasm
Run Code Online (Sandbox Code Playgroud)
到 /etc/mime.type
但我收到此错误。
wasm streaming compile failed: CompileError: WebAssembly.instantiateStreaming(): expected magic word 00 61 73 6d, found 1f 8b 08 18 @+0
Run Code Online (Sandbox Code Playgroud)
设置所需的修改后,我确实重新启动了服务。
我的 webgl 构建在没有 webassembly 流功能的情况下完美运行。
有没有人知道这个问题以及我做错了什么?
我有一个 Blazor WebAssembly 应用程序(ASP.Net Core 托管,渐进式 Web 应用程序),其逻辑如下:
客户:
protected override async Task OnInitializedAsync()
{
string token = await _loginService.GetToken();
_http.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
var result = await _http.PostAsJsonAsync("api/api/getcalllogs", userCallsRequestFilters);
if (result.IsSuccessStatusCode)
{
var morUserCallLogs = await result.Content.ReadFromJsonAsync<MorUserCallLogsResponse>();
await js.InvokeAsync<object>("TestDataTablesAdd", "#example");
}
else
{
morUserCallLogs = new MorUserCallLogsResponse();
}
}
Run Code Online (Sandbox Code Playgroud)
服务器:(服务器端 API 我有以下代码按预期工作:)
[Authorize]
[ApiController]
[Route("api/[controller]")]
public class MorApiController : ControllerBase
...
[HttpPost("getcalllogs")]
public async Task<MorUserCallLogsResponse> GetCallLogs ([FromBody] MorUserCallsRequestFilters filters)
{
...
return result;
Run Code Online (Sandbox Code Playgroud)
服务器端控制器 API 填充模型正常,当我检查时,我看到以下快照(* 为了安全起见,某些值已被清除)

模型:(我的 …
情况:我目前在 LLVM IR 中解析前端语言并生成函数定义。
我可以使用 LLVM12 C++ API 将函数定义编译为 WebAssembly 文件。
但是,生成的 wasm 代码不会“导出”任何已编译的函数,因此无法从加载 wasm 文件的 javascript 访问。
问题:有人可以让我知道我可能遗漏了什么吗?如何告诉 llvm 编译器为定义的函数创建导出。我尝试将函数可见性设置为 llvm::GlobalValue::DefaultVisibility。但这似乎没有帮助。
为函数生成的 IR(具有默认可见性)看起来像
define double @f(double %x) #0 {
entry:
%multmp = fmul double %x, 2.000000e+00
ret double %multmp
}
attributes #0 = { "target-features" }
Run Code Online (Sandbox Code Playgroud)
将包含函数定义的模块编译到 Wasm 目标的函数如下所示:
define double @f(double %x) #0 {
entry:
%multmp = fmul double %x, 2.000000e+00
ret double %multmp
}
attributes #0 = { "target-features" }
Run Code Online (Sandbox Code Playgroud)
这会输出一个看起来像的 wasm 文件
(module
(type …Run Code Online (Sandbox Code Playgroud) webassembly ×10
blazor ×2
c++ ×2
asm.js ×1
asp.net ×1
asp.net-core ×1
c# ×1
clang ×1
core ×1
emscripten ×1
enscript ×1
import ×1
javascript ×1
llvm ×1
llvm-c++-api ×1
module ×1
typescript ×1
unity-webgl ×1
versioning ×1
wasm-bindgen ×1
webpack ×1