Summary:
environ is documented to not work very well from .dylib-s (dynamic libraries) on macOS. Use the _NSGetEnviron function instead to get a pointer to environ.
<crt_externs.h> is missing from some iOS SDKs, so forward-declare _NSGetEnviron in such cases.
Reviewed By: Orvid, mzlee
Differential Revision:
D4491044
fbshipit-source-id:
886d19bdd63dea14225992446b7ba132faf35054
#include <cstdlib>
+#if defined(__APPLE__)
+#if __has_include(<crt_externs.h>)
+#include <crt_externs.h>
+#endif
+#endif
+
extern "C" {
#ifdef _WIN32
// These are technically supposed to be defined linux/limits.h and
int setenv(const char* name, const char* value, int overwrite);
int unsetenv(const char* name);
#elif defined(__APPLE__)
-extern char** environ;
+// environ doesn't work well with dylibs, so use _NSGetEnviron instead.
+#if !__has_include(<crt_externs.h>)
+char*** _NSGetEnviron(void);
+#endif
+#define environ (*_NSGetEnviron())
#endif
}