Hi Jakub,

> On Wed, Aug 31, 2022 at 12:56:25PM +0200, Marcel Vollweiler wrote:
>> libgomp/ChangeLog:
[...]
>>      (initialize_env): Extended to parse the new syntax of environment
>>      variables.

this patch broke Darwin bootstrap:

Undefined symbols for architecture x86_64:
  "_environ", referenced from:
      _initialize_env in env.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make[5]: *** [libgomp.la] Error 1

This is documented in environ(7):

     Shared libraries and bundles don't have direct access to environ, which
     is only available to the loader ld(1) when a complete program is being
     linked.  The environment routines can still be used, but if direct access
     to environ is needed, the _NSGetEnviron() routine, defined in
     <crt_externs.h>, can be used to retrieve the address of environ at run-
     time.

The following patch/hack, taken from
libgfortran/intrinsics/execute_command_line.c, allows the link to
succeed.  Bootstrap still running...

        Rainer

-- 
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University


diff --git a/libgomp/env.c b/libgomp/env.c
--- a/libgomp/env.c
+++ b/libgomp/env.c
@@ -54,6 +54,13 @@
 #include <errno.h>
 #include "thread-stacksize.h"
 
+#ifdef __APPLE__
+# include <crt_externs.h>
+# define environ (*_NSGetEnviron ())
+#else
+extern char **environ;
+#endif
+
 #ifndef HAVE_STRTOULL
 # define strtoull(ptr, eptr, base) strtoul (ptr, eptr, base)
 #endif
@@ -2033,7 +2040,6 @@ startswith (const char *str, const char 
 static void __attribute__((constructor))
 initialize_env (void)
 {
-  extern char **environ;
   char **env;
   int omp_var, dev_num = 0, dev_num_len = 0, i;
   bool ignore = false;

Reply via email to