Как заставить wasm-ld соблюдать атрибут wasm-import-module

Исправлено: я установил класс хранения DLL для функции, в которую я импортировал dllimport, и это позволило wasm-ld выдать правильное пространство имен импорта.

Я создаю компилятор с библиотекой LLVMSharp*, и он генерирует файлы модуля LLVM .bc, предназначенные для wasm32-unknown-unknown. Я пытаюсь импортировать в него функции из интерфейса WASI, помечая значения этих функций с помощью{ "wasm-import-module"="wasi_unstable" }атрибут. (Это должно быть эквивалентно тому, что clang делает с__attribute__((import_module(<module_name>))); см. здесь). Однако, когда я передаю полученные файлы.bc в wasm-ld (установленная 64-разрядная версия Windows 9.0.0), полученный модуль.wasm по-прежнему импортирует эти функции из"env", что не работает.

Есть ли возможность передать wasm-ld, чтобы он обработал wasm-import-module правильно, или мне нужно идти другим маршрутом?

* В частности, я использую LLVMSharp 5.0.0, последнюю стабильную версию. Возможно, что LLVMSharp 8.0.0 может поддерживать сборку модулей.wasm, но для него нет выпуска NuGet, а у бета-версии NuGet есть некоторые проблемы, которые не позволяют мне выполнить обновление. Вот почему я иду по пути wasm-ld.

1 ответ

Решение

Wasm -ld должен поддерживать этот атрибут. Первое, что нужно проверить, это ваш объектный файл.

Ты можешь использовать llvm-readobj --symsчтобы сбросить символы в ваш объектный файл. Тебе следует увидетьImportModule: foo на вашем символе, где foo - это имя модуля, которое вы указали в своем атрибуте.

Похоже, поддержка этого появилась в wasm-ld в: https://reviews.llvm.org/D45796

Я считаю, что это изменение появилось незадолго до llvm 8.0, поэтому вы будете использовать llvm 8.0 или выше.

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