diff --git a/expected/wasm32-wasi/defined-symbols.txt b/expected/wasm32-wasi/defined-symbols.txt index c97b326..b8d2ba8 100644 --- a/expected/wasm32-wasi/defined-symbols.txt +++ b/expected/wasm32-wasi/defined-symbols.txt @@ -313,6 +313,7 @@ __wasilibc_fd_renumber __wasilibc_find_abspath __wasilibc_find_relpath __wasilibc_find_relpath_alloc +__wasilibc_get_environ __wasilibc_initialize_environ __wasilibc_link __wasilibc_link_newat diff --git a/libc-bottom-half/headers/public/wasi/libc-environ.h b/libc-bottom-half/headers/public/wasi/libc-environ.h index ffc962e..f84ba8e 100644 --- a/libc-bottom-half/headers/public/wasi/libc-environ.h +++ b/libc-bottom-half/headers/public/wasi/libc-environ.h @@ -24,6 +24,11 @@ void __wasilibc_deinitialize_environ(void); /// referenced in the program. void __wasilibc_maybe_reinitialize_environ_eagerly(void); +/// Return the value of the `environ` variable. Using `environ` directly +/// requires eager initialization of the environment variables. Using this +/// function instead of `environ` allows initialization to happen lazily. +char **__wasilibc_get_environ(void); + #ifdef __cplusplus } #endif diff --git a/libc-bottom-half/sources/__wasilibc_environ.c b/libc-bottom-half/sources/__wasilibc_environ.c new file mode 100644 index 0000000..53d0a55 --- /dev/null +++ b/libc-bottom-half/sources/__wasilibc_environ.c @@ -0,0 +1,14 @@ +#include + +extern char **__wasilibc_environ; + +// See the comments in libc-environ.h. +char **__wasilibc_get_environ(void) { + // Perform lazy initialization if needed. + __wasilibc_ensure_environ(); + + // Return `environ`. Use the `__wasilibc_`-prefixed name so that we don't + // pull in the `environ` symbol directly, which would lead to eager + // initialization being done instead. + return __wasilibc_environ; +}