Есть ли способ проверить модуль wasm на предмет импорта
Позвольте мне немного объяснить, чем я занимаюсь. У меня есть приложение, в которое я встраиваю wasm-движок (в частности, wasmtime) и пишу wasm на Rust. Цель небраузер, поэтому я не использую wasm-bindgen. Я пытаюсь импортировать две функции из среды хоста. Я получил его, чтобы работать, но с небольшим взломом, и я хотел бы удалить взлом. Вот в чем проблема. Мне удалось выяснить, как заставить Rust генерировать операторы импорта в выводе wasm. Проблема в том, что если эти функции не используются, операторы импорта в wasm не включаются. Wasmtime, похоже, требует, чтобы количество операций импорта, переданных в экземпляр wasm, соответствовало количеству операторов импорта. Имеет смысл, что если модуль wasm ожидает импорта, это проблема, если вы его не предоставите. Проблема в том, что это также ошибка, если вы предоставляете импорт, а он не используется.
Итак, я вижу два способа исправить это: либо мне нужно выяснить, как заставить Rust включать операторы импорта, даже если они не используются (прямо сейчас хакерство состоит в том, чтобы вызывать функции, но игнорировать результаты, и в основном это отрицательно). -op) или найти способ проанализировать wasm, выяснить, какой импорт он ожидает, и передать только то, что он просит.
Мой вопрос в том, что это правильный подход, и если да, то как вы это делаете?
2 ответа
Вы можете конвертировать между
.wasm
(двоичный формат) и
.wat
(текстовый формат) с помощью The WebAssembly Binary Toolkit . Это открытый исходный код . Возможно, это поможет вам программно извлечь необходимый импорт.
Чтобы найти импорт модуля wasm, вы можете использовать инструмент командной строки, который преобразует
.wasm
к
.wat
и проверьте файл wat (используя grep или аналогичный). Например
wasm-dis
который является частью
binaryen
или
wasm2wat
который является частью может быть использован (или
wasm-objdump
который также является частью
wabt
).