Open3

WasmLinux: ユーザーランドに引数を渡す

okuokuokuoku

先は長い。。これから execveexecveat を実装するにあたって、まず引数が正確に渡せるのは動作確認に必須なので。。

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);   
okuokuokuoku

ダンプするコード

たとえば、↓のようなコードを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
 :
 :
okuokuokuoku

できた

そういやこの辺は既にあるんだった。。

https://github.com/okuoku/lkl-wasm/commit/9c5c0af4a9775f6fba1087d74a56cba3175a34fa

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