Как я могу вызвать exec для загрузки одной программы WASM из другой?
Как я могу вызвать WASM? Когда я пробую приведенный ниже пример, он выдает ошибку
45
(Operation not supported
). Есть ли какой-нибудь флаг для включения? Являетсяcallee.wasm
не тот файл?
Терминал:
> emcc callee.c -o callee.wasm
> emcc caller.c --embed-file callee.wasm -o index.html
> # will be used through index.html, but node is faster for development
> # note: MEMFS working directory is "/" and "/callee.wasm" exists
> # https://emscripten.org/docs/api_reference/Filesystem-API.html
> node index.js
Caller
Caller: 45
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
int main() {
printf("Caller\n");
char *args[] = {"./callee.wasm", NULL};
execvp(args[0], args);
printf("Caller: %d\n", errno);
}
callee.c
#include <stdio.h>
int main() {
printf("Success!\n");
}
Следует уточнить, что это упрощенная версия, поэтому не предлагайте помещатьprintf("Success!\n");
вcaller.c
и избегаяexec
полностью.
1 ответ
Кажется, вы не можете, если не считать повторной реализацииexec
сам.
Сначала порядок действий: 45 нет . EOPNOTSUPP
под Эмскриптеном, как следует из вопроса; на самом деле это так (см.arch/emscripten/bits/errno.h
иwasi/api.h
). цифры, как правило, не совпадают между платформами, и нет причин, по которымerrno
числа в BSD libc согласуются с Emscripten libc.
Emscripten libcИ жесткие кодыexecve
всегда терпеть неудачу с
ENOEXEC
, и весьexec*
семейство вызовов libc в конечном итоге оказывается там, включая
execvp
. Однако символ объявлен как слабый, поэтому в принципе вы можете заменить реализацию по умолчанию своей собственной. Как вы собираетесь этого добиться, я оставляю на ваше усмотрение.