Есть ли способ проверить модуль 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).

Другие вопросы по тегам