Hi,
not sure if this is covered directly by my Darwin maintainer’s hat so …
-----
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 such cases, the function _NSGetEnviron should be called to get
the address of 'environ’.
tested on a number of Darwin platforms old and new, and on
x86_64/powerpc64-linux,
OK for master?
… and backports to open branches?
thanks
Iain
** we’ve been “getting away with it” because of the application of
dynamic_lookup in a rather broad manner, which I’m about to get rid
of.
—————
libgfortran/ChangeLog:
* intrinsics/execute_command_line.c (environ): Use
_NSGetEnviron to get the environment pointer on Darwin.
---
libgfortran/intrinsics/execute_command_line.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/libgfortran/intrinsics/execute_command_line.c
b/libgfortran/intrinsics/execute_command_line.c
index 71d61a766ad..6d7b8fc658e 100644
--- a/libgfortran/intrinsics/execute_command_line.c
+++ b/libgfortran/intrinsics/execute_command_line.c
@@ -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>
--
2.24.1