1DOLLY 72PACKAGE libffi3REQUIRES HOST runtime@04REQUIRES HOST dso@056# libffi from upstream's release with Dolly's target (libffi-dolly.c): calls7# and closures go through dso@0's FFI in the process's own Worker, so a8# program that links it records dso@0. CPython's ctypes and GObject use it.9FROM /v0.1.4/Dollyfile-system 915c71d4ce772989e3076060967824e48ccd6a1a6259624fe6213542df088dbc10REQUIRES HEADER dso11REQUIRES HEADER libc12REQUIRES TOOL   ar13REQUIRES TOOL   cc14REQUIRES TOOL   make15REQUIRES TOOL   rm16REQUIRES TOOL   tar1718SOURCE /v0.1.4/dist/static/python/libffi.tar f1edc3a00490ab6d673adb1202b0d779fdbff33bd28ab8382e39847e64109bce /tmp/libffi.tar19SLOP tar \20  -xf /tmp/libffi.tar \21  -C /2223SOURCE /v0.1.4/dist/static/python/runtimes/libffi-dolly.c d5a180a210d829268b9686620fbfa2e5a5e439a2b0fe46ca55b12555f4b6f0d8 /usr/src/libffi/src/dolly.c2425FILE /tmp/libffi/Makefile26    .RECIPEPREFIX := >27    CC := cc28    AR := ar29    ROOT := /usr/src/libffi30    CFLAGS := -O1 -std=c17 -DHAVE_CONFIG_H -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/src31    NAMES := prep_cif types raw_api java_raw_api tramp dolly32    OBJECTS := $(addprefix /tmp/libffi/,$(addsuffix .o,$(NAMES)))33    all: /usr/lib/libffi.a34    /tmp/libffi/%.o: $(ROOT)/src/%.c35    >$(CC) $(CFLAGS) -c $< -o $@36    /usr/lib/libffi.a: $(OBJECTS)37    >$(AR) rcs $@ $^38SLOP make \39  -f /tmp/libffi/Makefile4041FILE /tmp/libffi-check.c42    #include <ffi.h>43    #include <stdio.h>44    static int add(int left, int right) { return left + right; }45    static void add_closure(ffi_cif *cif, void *result, void **arguments,46                            void *context) {47      (void)cif;48      *(int *)result = *(int *)arguments[0] + *(int *)context;49    }50    int main(void) {51      ffi_cif cif;52      ffi_type *types[] = {&ffi_type_sint32, &ffi_type_sint32};53      int left = 19, right = 23, answer = 0;54      void *values[] = {&left, &right};55      if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2,56                       &ffi_type_sint32, types) != FFI_OK) return 10;57      ffi_call(&cif, FFI_FN(add), &answer, values);58      if (answer != 42) return 11;59      void *code = 0;60      ffi_closure *closure = ffi_closure_alloc(sizeof(*closure), &code);61      ffi_type *one_type[] = {&ffi_type_sint32};62      if (closure == 0 ||63          ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,64                       &ffi_type_sint32, one_type) != FFI_OK ||65          ffi_prep_closure_loc(closure, &cif, add_closure, &right, code) != FFI_OK) {66        return 12;67      }68      int (*callback)(int) = code;69      answer = callback(19);70      ffi_closure_free(closure);71      if (answer != 42) return 13;72      return puts("LIBFFI-WASM64-OK") < 0 ? 14 : 0;73    }74SLOP cc \75  -O1 \76  -std=c17 \77  /tmp/libffi-check.c \78  -o /tmp/libffi-check \79  -lffi80SLOP slop \81  -c \82  /tmp/libffi-check8384EXPORTS LIB    ffi       /usr/lib/libffi.a85EXPORTS HEADER ffi       /usr/include/ffi.h86EXPORTS HEADER ffitarget /usr/include/ffitarget.h87FILE /usr/lib/pkgconfig/libffi.pc88    prefix=/usr89    libdir=/usr/lib90    includedir=/usr/include91    92    Name: libffi93    Description: Library supporting Foreign Function Interfaces94    Version: 3.5.295    Libs: -L${libdir} -lffi96    Cflags: -I${includedir}97EXPORTS FILE   libffi-pkgconfig /usr/lib/pkgconfig/libffi.pc98FILE /usr/share/licenses/libffi/LICENSE99100SLOP rm \101  -rf \102  /tmp/libffi \103  /tmp/libffi-check \104  /tmp/libffi-check.c \105  /tmp/libffi.tar \106  /usr/src/libffi107