Как я могу вызвать 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. Однако символ объявлен как слабый, поэтому в принципе вы можете заменить реализацию по умолчанию своей собственной. Как вы собираетесь этого добиться, я оставляю на ваше усмотрение.

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