* module/system/foreign-library.scm (load-foreign-library): On macOS calling `dlopen` with RTLD_LAZY | RTLD_LOCAL causes a crash when calling `dlsym`. There are a three working combinations:
- Using RTLD_NOW | RTLD_LOCAL - Using RTLD_NOW | RTLD_GLOBAL - Using RTLD_LAZY | RTLD_GLOBAL For efficiency purposes we choose RTLD_LAZY | RTLD_GLOBAL. See https://lists.gnu.org/archive/html/guile-devel/2021-09/msg00008.html --- module/system/foreign-library.scm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/module/system/foreign-library.scm b/module/system/foreign-library.scm index dc426385f..63889277c 100644 --- a/module/system/foreign-library.scm +++ b/module/system/foreign-library.scm @@ -172,6 +172,11 @@ name." (else name))))) +;; In macOS using dlopen with RTLD_LAZY | RTLD_LOCAL produces a crash. +;; https://lists.gnu.org/archive/html/guile-devel/2021-09/msg00008.html +(define system-needs-global? + (string-contains %host-type "-darwin")) + (define* (load-foreign-library #:optional filename #:key (extensions system-library-extensions) (search-ltdl-library-path? #t) @@ -186,7 +191,7 @@ name." #f)) (define flags (logior (if lazy? RTLD_LAZY RTLD_NOW) - (if global? RTLD_GLOBAL RTLD_LOCAL))) + (if (or global? system-needs-global?) RTLD_GLOBAL RTLD_LOCAL))) (define (dlopen* name) (dlopen name flags)) (if (and rename-on-cygwin? (string-contains %host-type "cygwin")) (set! filename (lib->cyg filename))) -- 2.33.0