Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Hack for segmentation faults on Apple Silicon(Macos arm64)
There is one bugs in py. The api only returns the address of exec not closure. On linux arm64 and x86_64 platforms, exec adrress is same as closre. However, on Macos arm64, it is not true. Then segmentation fault happens while calling g_callable_info_free_closure() on exec ptr. Try the C code: ======================================================================== void puts_binding(ffi_cif *cif, void *ret, void* args[], void *stream) { *(ffi_arg *)ret = fputs(*(char **)args[0], (FILE *)stream); } typedef int (*puts_t)(char *); int main() { ffi_cif cif; ffi_type *args[1]; ffi_closure *closure; void *bound_puts; int rc; /* Allocate closure and bound_puts */ closure = ffi_closure_alloc(sizeof(ffi_closure), &bound_puts); if (closure) { /* Initialize the argument info vectors */ args[0] = &ffi_type_pointer; /* Initialize the cif */ if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_sint, args) == FFI_OK) { /* Initialize the closure, setting stream to stdout */ if (ffi_prep_closure_loc(closure, &cif, puts_binding, stdout, bound_puts) == FFI_OK) { rc = ((puts_t)bound_puts)(""); /* rc now holds the result of the call to fputs */ } } printf("closure:%p exec: %p\n", closure, bound_puts); /* Deallocate both closure, and bound_puts */ ffi_closure_free(closure); return 0; } ======================================================================== I tried to fix it but there are some bugs in pyobject which also cause segmentation faults. I'm not a pundit in these messy code so just do hacks in pyobject to fix it. Link: https://gitlab.gnome.org/GNOME/pygobject/-/issues/455 Link: jeffreywildman/homebrew-virt-manager#166 (comment) Signed-off-by: Su Yue <[email protected]>
- Loading branch information