-
Notifications
You must be signed in to change notification settings - Fork 202
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Lazy-initialize the environment variables. (#184)
* Lazy-initialize the environment variables. This is the first in a series of PRs to make it easier to use WASI libc in Wasm modules that don't have a `main` function. By initializing the environment on demand, we avoid depending on having `__wasm_call_ctors` run. This uses weak symbols strategically to ensure that if `environ` is used, it is initialized eagerly, but if only `getenv` and friends are used, the environment is initialized lazily. Eventually, I expect we'll have a convention for wasm modules without main functions which will allow the `__wasm_call_ctors` function to be called automatically, but this helps in simple cases for now. Fixes #180. * Add comments explaining the libc-environ-compat.h header usage.
- Loading branch information
1 parent
38b930a
commit 9efc2f4
Showing
13 changed files
with
124 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
#ifndef __wasi_libc_environ_h | ||
#define __wasi_libc_environ_h | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
/// Initialize the global environment variable state. Only needs to be | ||
/// called once; most users should call `__wasilibc_ensure_environ` instead. | ||
void __wasilibc_initialize_environ(void); | ||
|
||
/// If `__wasilibc_initialize_environ` has not yet been called, call it. | ||
void __wasilibc_ensure_environ(void); | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
#include <unistd.h> | ||
#include <stdlib.h> | ||
#include <sysexits.h> | ||
#include <wasi/api.h> | ||
#include <wasi/libc.h> | ||
#include <wasi/libc-environ.h> | ||
|
||
// If the program does use `environ`, it'll get this version of | ||
// `__wasilibc_environ`, which is initialized with a constructor function, so | ||
// that it's initialized whenever user code might want to access it. | ||
char **__wasilibc_environ; | ||
extern __typeof(__wasilibc_environ) _environ | ||
__attribute__((weak, alias("__wasilibc_environ"))); | ||
extern __typeof(__wasilibc_environ) environ | ||
__attribute__((weak, alias("__wasilibc_environ"))); | ||
|
||
// We define this function here in the same source file as | ||
// `__wasilibc_environ`, so that this function is called in iff environment | ||
// variable support is used. | ||
// Concerning the 50 -- levels up to 100 are reserved for the implementation, | ||
// so we an arbitrary number in the middle of the range to allow other | ||
// reserved things to go before or after. | ||
__attribute__((constructor(50))) | ||
static void __wasilibc_initialize_environ_eagerly(void) { | ||
__wasilibc_initialize_environ(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
// This header file is meant to be included withinin the body of a function | ||
// which uses `__environ`. Code using `__environ` expects it will be initialized | ||
// eagerly. `__wasilibc_environ` is initialized lazily. Provide `__environ` as | ||
// an alias and arrange for the lazy initialization to be performed. | ||
|
||
extern char **__wasilibc_environ; | ||
|
||
__wasilibc_ensure_environ(); | ||
|
||
#ifndef __wasilibc_environ | ||
#define __environ __wasilibc_environ | ||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters