Utilia

Disassembler WebAssembly

Převeď binární soubor .wasm na čitelný text WAT, ověř jeho platnost a zobraz sekce, importy, exporty a funkce ve svém prohlížeči, aniž by se modul spustil.

Modul se jen čte a převádí na text: nikdy se nekompiluje, neinstancuje ani nespouští.

Jak převést WASM na WAT

  1. Přetáhni soubor .wasm na oblast pro přetažení nebo na ni klikni a vyber ho (do 20 MB). Tlačítkem Načíst ukázkový modul si můžeš také prohlédnout malé demo.
  2. Nástroj binární soubor zkontroluje, ověří jeho platnost a zobrazí výsledek: ✓ Modul je platný., nebo důvod, proč není.
  3. Přečti si počitadla: Funkce (importované a definované), Importy, Exporty, Typy, Paměti, Tabulky a Globální proměnné.
  4. Disassemblovaný kód si přečti v části Textový formát WebAssembly (WAT), pak ho Kopírovat nebo stiskni Stáhnout .wat.
  5. Výstup uprav volbami: Použít názvy z názvové sekce, Složené výrazy (S-výrazy) a Exporty přímo u funkcí.
  6. Tabulky Sekce, Importy a Exporty otevři pro rozvržení souboru: každá sekce s posunem v bajtech, velikostí a počtem položek.

Modul se nikdy nekompiluje, neinstancuje ani nespouští. Nástroj jen čte jeho bajty a mění je na text, takže je bezpečné zkoumat i soubor, kterému nedůvěřuješ.

Co výstup WAT ukazuje

WebAssembly má dva rovnocenné formáty: kompaktní binární .wasm, který načítají prohlížeče a běhová prostředí, a textový formát .wat, určený lidem. Disassembler vypisuje každou část modulu v textové podobě: typy funkcí, importy, těla funkcí, tabulky, paměti, globální proměnné, exporty, startovní funkci, segmenty elementů a datové segmenty.

Ve výchozím stavu se instrukce vypisují po jedné na řádek v pořadí zásobníku, tak jak jsou uloženy:

(func $add (param $a i32) (param $b i32) (result i32)
  local.get $a
  local.get $b
  i32.add)

S volbou Složené výrazy (S-výrazy) se operandy vnořují do instrukce, která je používá, jako v (i32.add (local.get $a) (local.get $b)), což se často sleduje snáz. Exporty přímo u funkcí zapisuje (export "add") uvnitř funkce místo do samostatného seznamu.

Názvy, ladicí informace a ověření platnosti

Soubor .wasm odkazuje na všechno pomocí indexů. Když kompilátor zachoval vlastní sekci name (běžné u ladicích sestavení), volba Použít názvy z názvové sekce ukáže původní názvy jako $factorial. Jinak wabt vygeneruje názvy jako $f2 nebo $t0, aby text zůstal čitelný. Produkční sestavení bývají o názvy ochuzena, takže minifikovaný modul ukáže jen vygenerované názvy.

Ověření platnosti se řídí specifikací WebAssembly: typy na zásobníku operandů musí sedět, indexy musí existovat a tak dále. Neplatný modul se přesto disassembluje, pokud lze přečíst jeho strukturu, a vedle výsledku se zobrazí chyba ověření, což pomáhá při ladění kompilátoru nebo ručně psaného binárního souboru. Vlastnosti po MVP, jako SIMD, vlákna, hromadné operace s pamětí, referenční typy, více návratových hodnot, koncová volání, zpracování výjimek, memory64 a garbage collection, jsou pro čtení povoleny.

Tento nástroj používá wabt.js, JavaScriptové sestavení WebAssembly Binary Toolkit (wasm2wat). Načítá se až po otevření souboru.

Časté dotazy

Mohu získat zpět původní zdrojový kód v C, C++ nebo Rustu?

Ne. WAT je čitelná podoba zkompilovaného binárního souboru, nikoli dekompilátor: zdrojový kód, komentáře a většina informací o typech po kompilaci zmizí. Názvy funkcí přežijí jen tehdy, když byla zachována názvová sekce.

Nahrává se můj soubor na server?

Ne. Soubor se čte a disassembluje ve tvém prohlížeči; nic se neposílá na server.

Proč nástroj hlásí, že soubor není binární soubor WebAssembly?

Každý modul začíná čtyřmi bajty \0asm následovanými verzí 1. Soubor poskytovaný s jiným obsahem, komprimovaný pomocí gzip nebo Brotli, nebo komponenta WebAssembly (novější model komponent) se odmítne.

Proč je textové pole oříznuté?

Velmi velké moduly mohou vytvořit miliony řádků. Textové pole ukazuje první část, aby stránka zůstala svižná; Stáhnout .wat uloží kompletní text.

Mohu modul zde spustit nebo otestovat?

Ne. Modul se záměrně nikdy neinstancuje, takže jeho kód nemůže běžet na stránce. K testování ho načti ve vlastním projektu nebo v běhovém prostředí, jako je wasmtime nebo Node.js.