Причина в том, что вы не экспортировали никаких символов во время связывания.
Возможно, вы захотите проверить the Exports section of wasm-ld docs
, но вот что они говорят о значениях по умолчанию:
При создании исполняемого файла по умолчанию экспортируются только точка входа (_start
) и символы с флагом WASM_SYMBOL_EXPORTED
.
У вас есть несколько вариантов:
- Переименование
main
в _start
- это гарантирует, что _start
будет экспортирован, и любая из его зависимостей будет правильно импортирована из среды, а не из GCd в целом, как это происходит прямо сейчас. - Вызов
wasm-ld
с флагом --export-all
- при этом будут экспортированы все символы в объектном файле. Этот вариант обычно не рекомендуется, так как вы можете предотвратить полезную оптимизацию размера и выставить вещи, которые вы не хотели показывать, но могут подойти для прототипирования. - Вызовите
wasm-ld
с --export-dynamic
- это будет экспортировать все символы, помеченные как видимые на уровне ИК. - Явно перечислять символы при вызове
wasm-ld
, например, --export=main
.
Еще одно предупреждение, о котором следует знать в все параметры, кроме (1), заключаются в том, что main
обрабатывается особым образом, и с вашим текущим кодом это приведет к двум различным символам:
main
- автоматически сгенерированная функция-обертка с два аргумента для argc
и argv
, которые вызывают вашу функцию. __original_main
- символ для функции, которую вы на самом деле определили.
Чтобы убедиться, что вы не Чтобы не столкнуться с этим, либо следуйте опции 1 и переименуйте main
в _start
, которая является точкой входа, определяемой Wasm c и не принимает никаких параметров, либо измените сигнатуру вашей функции main
на правильную. а также принять как argc
и argv
как в C.
Надеюсь, все это должно помочь вам.