Open3
WasmLinux: ユーザーランドに引数を渡す
先は長い。。これから execve
や execveat
を実装するにあたって、まず引数が正確に渡せるのは動作確認に必須なので。。
int execve(const char *pathname, char *const argv[], char *const envp[]);
int execveat(int dirfd, const char *pathname, char *const argv[], char *const envp[], int flags);
ダンプするコード
たとえば、↓のようなコードをCygwinで実行すると:
#include <stdio.h>
int
main(int ac, char** av, char** envp){
int i;
/* Dump args */
i = 0;
while(av[i]){
fprintf(stderr, "[%d/%d]: %s\n", i, ac, av[i]);
i++;
}
i= 0;
while(envp[i]){
fprintf(stderr, "env [%d]: %s\n", i, envp[i]);
i++;
}
return 0;
}
引数と環境変数をダンプできる。引数には argc
があるが環境変数は単にNULLポインタで終端される。
$ ./a.exe a b c "d e f"
[0/5]: ./a
[1/5]: a
[2/5]: b
[3/5]: c
[4/5]: d e f
env [0]: ProgramFiles(x86)=C:\Program Files (x86)
env [1]: !::=::\
env [2]: CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
env [3]: asl.log=Destination=file
env [4]: SHELL=/bin/bash
env [5]: NUMBER_OF_PROCESSORS=8
env [6]: PROCESSOR_LEVEL=6
:
:
できた
そういやこの辺は既にあるんだった。。
TLS[58]: 1 -> 38880400
Thread: 58 Call = 63 Ret = 31
res = 31 (from: 58, 38880400)
[stderr]: [0/5]: dummy
[stderr]: [1/5]: a
[stderr]: [2/5]: b
TLS[58]: 1 -> 38880400
Rearm: 9188180
TLS[61]: 1 -> 38880800
Thread: 61 Call = 66 Ret = 9
(user) syscall = 66
TLS[61]: 1 -> 38880800
Thread: 58 Call = 63 Ret = 9
res = 9 (from: 58, 38880400)
[stderr]: [3/5]: c
Thread: 61 Call = 66 Ret = 13
(user) syscall = 66
TLS[61]: 1 -> 38880800
Thread: 61 Call = 66 Ret = 19
(user) syscall = 135
TLS[58]: 1 -> 38880400
Thread: 58 Call = 63 Ret = 32
res = 32 (from: 58, 38880400)
[stderr]: [4/5]: d e f
[stderr]: env [0]: PATH=/bin
TLS[58]: 1 -> 38880400
Rearm: 6659004