标签: webassembly

如何检查wasm二进制文件的WebAssembly版本

给定一个.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

versioning module webassembly

1
推荐指数
1
解决办法
632
查看次数

WebAssembly 堆栈/堆栈指针初始化和内存布局

我目前正在尝试通过 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”,但我也想了解这一点。

  • 堆栈指针是否始终存储在线性内存中的偏移量 4 处?
  • 它的初始值是如何计算的?(与数据后的下一个偏移%16==0 + N对齐?)
  • 它指向的偏移量之前存储了什么,之后存储了什么?

webassembly

1
推荐指数
1
解决办法
2591
查看次数

wasm 部分中大小字段的格式?

我正在与我自己的 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 数字转换为这种格式,因为目前我的解决方案看起来非常h​​acky?

webassembly

1
推荐指数
1
解决办法
407
查看次数

将 JS Web 程序集导入 TypeScript

我正在尝试在我的 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)

这是这个解决方案的来源

javascript import typescript webassembly

1
推荐指数
1
解决办法
3334
查看次数

EM_ASM 中的 js 代码会发生什么?

在 Enscripten 中,EM_ASM 函数内部的代码会发生什么?我的意思是该代码是否在运行时被编译或解释?如果编译,那么它在浏览器中是否比本地解释的 js 运行得更快或更慢?

c++ enscript webassembly

1
推荐指数
1
解决办法
111
查看次数

wasm-bindgen、asm.js 和 Emcripten 之间有什么区别?

我正在努力让 webpack 处理一组使用 wasm-bindgen 编译的WebAssembly 文件

即使这可能只是 webpack 的一个问题,它也让我意识到我没有完全掌握这些古怪的 WebAssembly 工具之间的差异。

emscripten asm.js webpack webassembly wasm-bindgen

1
推荐指数
1
解决办法
1108
查看次数

Blazor 选择绑定到列表中的值

我能够将一个 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)

c# asp.net core webassembly blazor

1
推荐指数
1
解决办法
8489
查看次数

使用 WebAssembly Streaming 的 Unity WebGL

我正在尝试使用 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 流功能的情况下完美运行。
有没有人知道这个问题以及我做错了什么?

webassembly unity-webgl

1
推荐指数
1
解决办法
4555
查看次数

ReadFromJsonAsync 返回具有 Null 值的对象属性

我有一个 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 填充模型正常,当我检查时,我看到以下快照(* 为了安全起见,某些值已被清除) 在此处输入图片说明

模型:(我的 …

webassembly asp.net-core blazor

1
推荐指数
2
解决办法
1873
查看次数

将函数从 LLVM C++ API 导出到 WebAssembly

情况:我目前在 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)

c++ llvm clang llvm-c++-api webassembly

1
推荐指数
1
解决办法
596
查看次数