From 3c4a3f94d1ce685a672ec9a642f1ae42dae16eb1 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Thu, 18 Mar 2021 09:48:01 -0700 Subject: [PATCH] Also add a way to read `environ` without triggering eager init. Add a `__wasilibc_get_environ` function which returns the value of `environ` but without performing eager init. --- expected/wasm32-wasi/defined-symbols.txt | 1 + .../headers/public/wasi/libc-environ.h | 5 +++++ libc-bottom-half/sources/__wasilibc_environ.c | 14 ++++++++++++++ 3 files changed, 20 insertions(+) create mode 100644 libc-bottom-half/sources/__wasilibc_environ.c 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; +}