|
From: | Torrekie |
Subject: | bug#64216: "ice-9 popen" cannot open process on Darwin |
Date: | Tue, 8 Aug 2023 19:30:46 +0800 |
Can confirm and reproduce this bug on macOS / iOS with Guile 3.0.9, it seems guile-config also affected by this bug which causing "pkg-config" calls always fail. ``` TorrekiedeMacBook-Pro:pv4 torrekie$ guile-config link error: ("/opt/homebrew/opt/pkg-config/bin/pkg-config" "--libs" "guile-3.0") exited with non-zero error code 127 ``` In guile-config, pkg-config was called through "open-pipe*" ``` (define (pkg-config . args) (let* ((real-args (cons %pkg-config-program args)) (pipe (apply open-pipe* OPEN_READ real-args)) (output (read-delimited "" pipe)) (ret (close-pipe pipe))) (case (status:exit-val ret) ((0) (if (eof-object? output) "" output)) (else (display-line-error (format #f "error: ~s exited with non-zero error code ~A" (cons %pkg-config-program args) (status:exit-val ret))) ;; assume pkg-config sent diagnostics to stdout (exit (status:exit-val ret)))))) ``` By attaching to LLDB I didn't see any exec/posix_spawn/popen been called, by inspecting the source code I see Guile's popen was implemented through `posix_spawn` ``` // libguile/posix.c static SCM scm_piped_process (SCM prog, SCM args, SCM from, SCM to) #define FUNC_NAME "piped-process" { pid_t pid; (void) piped_process (&pid, prog, args, from, to); if (pid == -1) { /* Create a dummy process that exits with value 127 to mimic the previous fork + exec implementation. TODO: This is a compatibility shim to remove in the next stable series. */ pid = fork (); if (pid == -1) SCM_SYSERROR; if (pid == 0) _exit (127); } return scm_from_int (pid); } #undef FUNC_NAME ``` The function "piped_process" is a wrapper for "do_spawn", the "do_spawn" retuns -1 while `posix_spawn` or `posix_spawnp` fails which finally regarding to the `_exit(127)` in above code. But obviously posix_spawn calls was working as expected in other programs, by doing `nm` we can see libguile was not actually referenced posix_spawn, instead, it defined an internal implementation of it. ``` TorrekiedeMacBook-Pro:pv4 torrekie$ nm /opt/homebrew/opt/guile/lib/libguile-3.0.dylib | grep posix_spawn 00000000000bfdb4 t _gl_posix_spawn_internal 00000000000bfc90 t _rpl_posix_spawn_file_actions_addclose 00000000000bfd18 t _rpl_posix_spawn_file_actions_adddup2 ``` In m4/posix_spawn.m4 logics, Guile does not trust Darwin posix_spawn* for some reason which causing REPLACE_POSIX_SPAWN has been defined, I am trying to rebuild one without replacing posix_spawn and see what happens. |
[Prev in Thread] | Current Thread | [Next in Thread] |