|
15 | 15 | #define dln_memerror rb_memerror
|
16 | 16 | #define dln_exit rb_exit
|
17 | 17 | #define dln_loaderror rb_loaderror
|
| 18 | +#define dln_fatalerror rb_fatal |
18 | 19 | #else
|
19 | 20 | #define dln_notimplement --->>> dln not implemented <<<---
|
20 | 21 | #define dln_memerror abort
|
21 | 22 | #define dln_exit exit
|
22 | 23 | static void dln_loaderror(const char *format, ...);
|
| 24 | +#define dln_fatalerror dln_loaderror |
23 | 25 | #endif
|
24 | 26 | #include "dln.h"
|
25 | 27 | #include "internal.h"
|
@@ -281,6 +283,24 @@ dln_incompatible_library_p(void *handle)
|
281 | 283 | COMPILER_WARNING_POP
|
282 | 284 | #endif
|
283 | 285 |
|
| 286 | +#if defined(MAC_OS_X_VERSION_MIN_REQUIRED) && \ |
| 287 | + (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_11) |
| 288 | +# include <sys/sysctl.h> |
| 289 | + |
| 290 | +static bool |
| 291 | +dln_disable_dlclose(void) |
| 292 | +{ |
| 293 | + int mib[] = {CTL_KERN, KERN_OSREV}; |
| 294 | + int32_t rev; |
| 295 | + size_t size = sizeof(rev); |
| 296 | + if (sysctl(mib, numberof(mib), &rev, &size, NULL, 0)) return true; |
| 297 | + if (rev < MAC_OS_X_VERSION_10_11) return true; |
| 298 | + return false; |
| 299 | +} |
| 300 | +#else |
| 301 | +# define dln_disable_dlclose() false |
| 302 | +#endif |
| 303 | + |
284 | 304 | #if defined(_WIN32) || defined(USE_DLN_DLOPEN)
|
285 | 305 | static void *
|
286 | 306 | dln_open(const char *file)
|
@@ -335,20 +355,19 @@ dln_open(const char *file)
|
335 | 355 | }
|
336 | 356 |
|
337 | 357 | # if defined(RUBY_EXPORT)
|
338 |
| - { |
339 |
| - if (dln_incompatible_library_p(handle)) { |
340 |
| -# if defined(__APPLE__) && \ |
341 |
| - defined(MAC_OS_X_VERSION_MIN_REQUIRED) && \ |
342 |
| - (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_11) |
| 358 | + { |
| 359 | + if (dln_incompatible_library_p(handle)) { |
| 360 | + if (dln_disable_dlclose()) { |
343 | 361 | /* dlclose() segfaults */
|
344 |
| - rb_fatal("%s - %s", incompatible, file); |
345 |
| -# else |
| 362 | + dln_fatalerror("%s - %s", incompatible, file); |
| 363 | + } |
| 364 | + else { |
346 | 365 | dlclose(handle);
|
347 | 366 | error = incompatible;
|
348 | 367 | goto failed;
|
349 |
| -# endif |
350 | 368 | }
|
351 | 369 | }
|
| 370 | + } |
352 | 371 | # endif
|
353 | 372 | #endif
|
354 | 373 |
|
|
0 commit comments