英文:
How can I invoke `exec` to chainload one WASM program from another?
问题
在WASM中如何调用exec?当我尝试下面的示例时,它会报错45(操作不支持)。是否有一些标志可以启用exec?callee.wasm是否是要执行的正确文件?
终端:
> emcc callee.c -o callee.wasm
> emcc caller.c --embed-file callee.wasm -o index.html
> # 将通过index.html使用,但是对于开发来说,node更快
> # 注意:MEMFS工作目录是“/”,并且存在“/callee.wasm”
> # https://emscripten.org/docs/api_reference/Filesystem-API.html
> node index.js
Caller
Caller: 45
caller.c
#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");
}
英文:
How can I invoke exec in WASM? When I try the example below, it gives error 45 (Operation not supported). Is there some flag to enable exec? Is callee.wasm not the right file to exec?
Terminal:
> 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
caller.c
#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");
}
It should be made clear that this is simplified version, so do not suggest putting printf("Success!\n"); in caller.c and avoiding exec entirely.
答案1
得分: 3
以下是翻译好的部分:
"Point of order first: errno 45 is not EOPNOTSUPP under Emscripten as the question would suggest; it is, in fact, ENOEXEC (see arch/emscripten/bits/errno.h and wasi/api.h). errno numbers are generally not consistent between platforms, and there is no reason why errno numbers in a BSD libc would agree with Emscripten libc.
And the Emscripten libc hardcodes execve to always fail with ENOEXEC, and the entire exec* family of libc calls ultimately ends up there, including execvp. The symbol is declared as weak, however, so you can in principle replace the default implementation with your own. How you are going to accomplish that, I leave up to you."
英文:
It seems you can’t, short of reimplementing exec yourself.
Point of order first: errno 45 is not EOPNOTSUPP under Emscripten as the question would suggest; it is, in fact, ENOEXEC (see arch/emscripten/bits/errno.h and wasi/api.h). errno numbers are generally not consistent between platforms, and there is no reason why errno numbers in a BSD libc would agree with Emscripten libc.
And the Emscripten libc hardcodes execve to always fail with ENOEXEC, and the entire exec* family of libc calls ultimately ends up there, including execvp. The symbol is declared as weak, however, so you can in principle replace the default implementation with your own. How you are going to accomplish that, I leave up to you.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论