Darwin, libgfortran : Do not use environ directly from the library.
authorIain Sandoe <iain@sandoe.co.uk>
Sat, 21 Nov 2020 09:06:03 +0000 (09:06 +0000)
committerIain Sandoe <iain@sandoe.co.uk>
Sat, 21 Nov 2020 09:06:49 +0000 (09:06 +0000)
On macOS / Darwin, the environ variable can be used directly in the
code of an executable, but cannot be used in the code of a shared
library (i.e. libgfortran.dylib), in this case.

In such cases, the  function _NSGetEnviron should be called to get
the address of 'environ'.

libgfortran/ChangeLog:

* intrinsics/execute_command_line.c (environ): Use
_NSGetEnviron to get the environment pointer on Darwin.

libgfortran/intrinsics/execute_command_line.c

index 71d61a766ad4ceeee87c48c08407ee445476e6ac..6d7b8fc658e6d33e31755cbd22c0192ec060aa57 100644 (file)
@@ -34,7 +34,12 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #endif
 #ifdef HAVE_POSIX_SPAWN
 #include <spawn.h>
+# ifdef __APPLE__
+#  include <crt_externs.h>
+#  define environ (*_NSGetEnviron ())
+# else
 extern char **environ;
+# endif
 #endif
 #if defined(HAVE_POSIX_SPAWN) || defined(HAVE_FORK)
 #include <signal.h>