summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--flang-rt/lib/runtime/environment.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/flang-rt/lib/runtime/environment.cpp b/flang-rt/lib/runtime/environment.cpp
index 97ac56236e79..2a2e19f9f17e 100644
--- a/flang-rt/lib/runtime/environment.cpp
+++ b/flang-rt/lib/runtime/environment.cpp
@@ -17,6 +17,10 @@
#ifdef _WIN32
extern char **_environ;
+#elif defined(__FreeBSD__)
+// FreeBSD has environ in crt rather than libc. Using "extern char** environ"
+// in the code of a shared library makes it fail to link with -Wl,--no-undefined
+// See https://reviews.freebsd.org/D30842#840642
#else
extern char **environ;
#endif
@@ -104,6 +108,11 @@ void ExecutionEnvironment::Configure(int ac, const char *av[],
#ifdef _WIN32
envp = _environ;
+#elif defined(__FreeBSD__)
+ auto envpp{reinterpret_cast<char ***>(dlsym(RTLD_DEFAULT, "environ"))};
+ if (envpp) {
+ envp = *envpp;
+ }
#else
envp = environ;
#endif