"pkg-config --exists libffi"
| pkg-config --libs libffi
=> "-L/usr/lib/../lib -lffi\n"
"gcc -o conftest -I/usr/include/ruby-2.4.0/aarch64-linux -I/usr/include/ruby-2.4.0/ruby/backward -I/usr/include/ruby-2.4.0 -I. -D_FORTIFY_SOURCE=2   -march=armv8-a -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -fPIC conftest.c  -L. -L/usr/lib -L. -Wl,-O1,--sort-common,--as-needed,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic     -lruby  -lpthread -lgmp -ldl -lcrypt -lm   -lc"
checked program was:
/* begin */
1: #include "ruby.h"
2: 
3: int main(int argc, char **argv)
4: {
5:   return 0;
6: }
/* end */

"gcc -o conftest -I/usr/include/ruby-2.4.0/aarch64-linux -I/usr/include/ruby-2.4.0/ruby/backward -I/usr/include/ruby-2.4.0 -I. -D_FORTIFY_SOURCE=2   -march=armv8-a -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -fPIC conftest.c  -L. -L/usr/lib -L. -Wl,-O1,--sort-common,--as-needed,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic     -lruby -L/usr/lib/../lib -lffi -lpthread -lgmp -ldl -lcrypt -lm   -lc"
checked program was:
/* begin */
1: #include "ruby.h"
2: 
3: int main(int argc, char **argv)
4: {
5:   return 0;
6: }
/* end */

| pkg-config --cflags-only-I libffi
=> "-I/usr/lib/libffi-3.2.1/include\n"
| pkg-config --cflags-only-other libffi
=> "\n"
| pkg-config --libs-only-l libffi
=> "-lffi\n"
package configuration for libffi
cflags: 
ldflags: -L/usr/lib/../lib
libs: -lffi

have_library: checking for ffi_call() in -lffi... -------------------- yes

"gcc -o conftest -I/usr/include/ruby-2.4.0/aarch64-linux -I/usr/include/ruby-2.4.0/ruby/backward -I/usr/include/ruby-2.4.0 -I. -I/usr/lib/libffi-3.2.1/include -D_FORTIFY_SOURCE=2   -march=armv8-a -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -fPIC  conftest.c  -L. -L/usr/lib -L. -Wl,-O1,--sort-common,--as-needed,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -L/usr/lib/../lib     -lffi -lruby -lffi  -lffi -lpthread -lgmp -ldl -lcrypt -lm   -lc"
checked program was:
/* begin */
 1: #include "ruby.h"
 2: 
 3: #include <ffi.h>
 4: 
 5: /*top*/
 6: extern int t(void);
 7: int main(int argc, char **argv)
 8: {
 9:   if (argc > 1000000) {
10:     printf("%p", &t);
11:   }
12: 
13:   return 0;
14: }
15: int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_call; return !p; }
/* end */

--------------------

have_func: checking for ffi_prep_closure()... -------------------- yes

"gcc -o conftest -I/usr/include/ruby-2.4.0/aarch64-linux -I/usr/include/ruby-2.4.0/ruby/backward -I/usr/include/ruby-2.4.0 -I. -I/usr/lib/libffi-3.2.1/include -D_FORTIFY_SOURCE=2   -march=armv8-a -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -fPIC  conftest.c  -L. -L/usr/lib -L. -Wl,-O1,--sort-common,--as-needed,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -L/usr/lib/../lib    -lffi  -lffi -lruby -lffi  -lffi -lpthread -lgmp -ldl -lcrypt -lm   -lc"
conftest.c: In function ‘t’:
conftest.c:13:57: error: ‘ffi_prep_closure’ undeclared (first use in this function)
 int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_prep_closure; return !p; }
                                                         ^~~~~~~~~~~~~~~~
conftest.c:13:57: note: each undeclared identifier is reported only once for each function it appears in
distcc[505] ERROR: compile conftest.c on localhost failed
checked program was:
/* begin */
 1: #include "ruby.h"
 2: 
 3: /*top*/
 4: extern int t(void);
 5: int main(int argc, char **argv)
 6: {
 7:   if (argc > 1000000) {
 8:     printf("%p", &t);
 9:   }
10: 
11:   return 0;
12: }
13: int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_prep_closure; return !p; }
/* end */

"gcc -o conftest -I/usr/include/ruby-2.4.0/aarch64-linux -I/usr/include/ruby-2.4.0/ruby/backward -I/usr/include/ruby-2.4.0 -I. -I/usr/lib/libffi-3.2.1/include -D_FORTIFY_SOURCE=2   -march=armv8-a -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -fPIC  conftest.c  -L. -L/usr/lib -L. -Wl,-O1,--sort-common,--as-needed,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -L/usr/lib/../lib    -lffi  -lffi -lruby -lffi  -lffi -lpthread -lgmp -ldl -lcrypt -lm   -lc"
checked program was:
/* begin */
 1: #include "ruby.h"
 2: 
 3: /*top*/
 4: extern int t(void);
 5: int main(int argc, char **argv)
 6: {
 7:   if (argc > 1000000) {
 8:     printf("%p", &t);
 9:   }
10: 
11:   return 0;
12: }
13: extern void ffi_prep_closure();
14: int t(void) { ffi_prep_closure(); return 0; }
/* end */

--------------------

have_func: checking for ffi_raw_call()... -------------------- yes

"gcc -o conftest -I/usr/include/ruby-2.4.0/aarch64-linux -I/usr/include/ruby-2.4.0/ruby/backward -I/usr/include/ruby-2.4.0 -I. -I/usr/lib/libffi-3.2.1/include -D_FORTIFY_SOURCE=2   -march=armv8-a -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -fPIC  conftest.c  -L. -L/usr/lib -L. -Wl,-O1,--sort-common,--as-needed,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -L/usr/lib/../lib    -lffi  -lffi -lruby -lffi  -lffi -lpthread -lgmp -ldl -lcrypt -lm   -lc"
conftest.c: In function ‘t’:
conftest.c:13:57: error: ‘ffi_raw_call’ undeclared (first use in this function)
 int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_raw_call; return !p; }
                                                         ^~~~~~~~~~~~
conftest.c:13:57: note: each undeclared identifier is reported only once for each function it appears in
distcc[515] ERROR: compile conftest.c on localhost failed
checked program was:
/* begin */
 1: #include "ruby.h"
 2: 
 3: /*top*/
 4: extern int t(void);
 5: int main(int argc, char **argv)
 6: {
 7:   if (argc > 1000000) {
 8:     printf("%p", &t);
 9:   }
10: 
11:   return 0;
12: }
13: int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_raw_call; return !p; }
/* end */

"gcc -o conftest -I/usr/include/ruby-2.4.0/aarch64-linux -I/usr/include/ruby-2.4.0/ruby/backward -I/usr/include/ruby-2.4.0 -I. -I/usr/lib/libffi-3.2.1/include -D_FORTIFY_SOURCE=2   -march=armv8-a -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -fPIC  conftest.c  -L. -L/usr/lib -L. -Wl,-O1,--sort-common,--as-needed,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -L/usr/lib/../lib    -lffi  -lffi -lruby -lffi  -lffi -lpthread -lgmp -ldl -lcrypt -lm   -lc"
checked program was:
/* begin */
 1: #include "ruby.h"
 2: 
 3: /*top*/
 4: extern int t(void);
 5: int main(int argc, char **argv)
 6: {
 7:   if (argc > 1000000) {
 8:     printf("%p", &t);
 9:   }
10: 
11:   return 0;
12: }
13: extern void ffi_raw_call();
14: int t(void) { ffi_raw_call(); return 0; }
/* end */

--------------------

have_func: checking for ffi_prep_raw_closure()... -------------------- yes

"gcc -o conftest -I/usr/include/ruby-2.4.0/aarch64-linux -I/usr/include/ruby-2.4.0/ruby/backward -I/usr/include/ruby-2.4.0 -I. -I/usr/lib/libffi-3.2.1/include -D_FORTIFY_SOURCE=2   -march=armv8-a -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -fPIC  conftest.c  -L. -L/usr/lib -L. -Wl,-O1,--sort-common,--as-needed,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -L/usr/lib/../lib    -lffi  -lffi -lruby -lffi  -lffi -lpthread -lgmp -ldl -lcrypt -lm   -lc"
conftest.c: In function ‘t’:
conftest.c:13:57: error: ‘ffi_prep_raw_closure’ undeclared (first use in this function)
 int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_prep_raw_closure; return !p; }
                                                         ^~~~~~~~~~~~~~~~~~~~
conftest.c:13:57: note: each undeclared identifier is reported only once for each function it appears in
distcc[525] ERROR: compile conftest.c on localhost failed
checked program was:
/* begin */
 1: #include "ruby.h"
 2: 
 3: /*top*/
 4: extern int t(void);
 5: int main(int argc, char **argv)
 6: {
 7:   if (argc > 1000000) {
 8:     printf("%p", &t);
 9:   }
10: 
11:   return 0;
12: }
13: int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_prep_raw_closure; return !p; }
/* end */

"gcc -o conftest -I/usr/include/ruby-2.4.0/aarch64-linux -I/usr/include/ruby-2.4.0/ruby/backward -I/usr/include/ruby-2.4.0 -I. -I/usr/lib/libffi-3.2.1/include -D_FORTIFY_SOURCE=2   -march=armv8-a -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -fPIC  conftest.c  -L. -L/usr/lib -L. -Wl,-O1,--sort-common,--as-needed,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -L/usr/lib/../lib    -lffi  -lffi -lruby -lffi  -lffi -lpthread -lgmp -ldl -lcrypt -lm   -lc"
checked program was:
/* begin */
 1: #include "ruby.h"
 2: 
 3: /*top*/
 4: extern int t(void);
 5: int main(int argc, char **argv)
 6: {
 7:   if (argc > 1000000) {
 8:     printf("%p", &t);
 9:   }
10: 
11:   return 0;
12: }
13: extern void ffi_prep_raw_closure();
14: int t(void) { ffi_prep_raw_closure(); return 0; }
/* end */

--------------------

have_func: checking for rb_thread_blocking_region()... -------------------- no

"gcc -o conftest -I/usr/include/ruby-2.4.0/aarch64-linux -I/usr/include/ruby-2.4.0/ruby/backward -I/usr/include/ruby-2.4.0 -I. -I/usr/lib/libffi-3.2.1/include -D_FORTIFY_SOURCE=2   -march=armv8-a -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -fPIC  conftest.c  -L. -L/usr/lib -L. -Wl,-O1,--sort-common,--as-needed,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -L/usr/lib/../lib    -lffi  -lffi -lruby -lffi  -lffi -lpthread -lgmp -ldl -lcrypt -lm   -lc"
conftest.c: In function ‘t’:
conftest.c:13:57: error: ‘rb_thread_blocking_region’ undeclared (first use in this function)
 int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_blocking_region; return !p; }
                                                         ^~~~~~~~~~~~~~~~~~~~~~~~~
conftest.c:13:57: note: each undeclared identifier is reported only once for each function it appears in
distcc[535] ERROR: compile conftest.c on localhost failed
checked program was:
/* begin */
 1: #include "ruby.h"
 2: 
 3: /*top*/
 4: extern int t(void);
 5: int main(int argc, char **argv)
 6: {
 7:   if (argc > 1000000) {
 8:     printf("%p", &t);
 9:   }
10: 
11:   return 0;
12: }
13: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_blocking_region; return !p; }
/* end */

"gcc -o conftest -I/usr/include/ruby-2.4.0/aarch64-linux -I/usr/include/ruby-2.4.0/ruby/backward -I/usr/include/ruby-2.4.0 -I. -I/usr/lib/libffi-3.2.1/include -D_FORTIFY_SOURCE=2   -march=armv8-a -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -fPIC  conftest.c  -L. -L/usr/lib -L. -Wl,-O1,--sort-common,--as-needed,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -L/usr/lib/../lib    -lffi  -lffi -lruby -lffi  -lffi -lpthread -lgmp -ldl -lcrypt -lm   -lc"
/tmp/ccxv5Cax.o: In function `t':
conftest.c:(.text+0x8): undefined reference to `rb_thread_blocking_region'
collect2: error: ld returned 1 exit status
distcc[539] ERROR: compile conftest.c on localhost failed
checked program was:
/* begin */
 1: #include "ruby.h"
 2: 
 3: /*top*/
 4: extern int t(void);
 5: int main(int argc, char **argv)
 6: {
 7:   if (argc > 1000000) {
 8:     printf("%p", &t);
 9:   }
10: 
11:   return 0;
12: }
13: extern void rb_thread_blocking_region();
14: int t(void) { rb_thread_blocking_region(); return 0; }
/* end */

--------------------

have_func: checking for rb_thread_call_with_gvl()... -------------------- yes

"gcc -o conftest -I/usr/include/ruby-2.4.0/aarch64-linux -I/usr/include/ruby-2.4.0/ruby/backward -I/usr/include/ruby-2.4.0 -I. -I/usr/lib/libffi-3.2.1/include -D_FORTIFY_SOURCE=2   -march=armv8-a -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -fPIC  conftest.c  -L. -L/usr/lib -L. -Wl,-O1,--sort-common,--as-needed,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -L/usr/lib/../lib    -lffi  -lffi -lruby -lffi  -lffi -lpthread -lgmp -ldl -lcrypt -lm   -lc"
conftest.c: In function ‘t’:
conftest.c:13:57: error: ‘rb_thread_call_with_gvl’ undeclared (first use in this function)
 int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_call_with_gvl; return !p; }
                                                         ^~~~~~~~~~~~~~~~~~~~~~~
conftest.c:13:57: note: each undeclared identifier is reported only once for each function it appears in
distcc[545] ERROR: compile conftest.c on localhost failed
checked program was:
/* begin */
 1: #include "ruby.h"
 2: 
 3: /*top*/
 4: extern int t(void);
 5: int main(int argc, char **argv)
 6: {
 7:   if (argc > 1000000) {
 8:     printf("%p", &t);
 9:   }
10: 
11:   return 0;
12: }
13: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_call_with_gvl; return !p; }
/* end */

"gcc -o conftest -I/usr/include/ruby-2.4.0/aarch64-linux -I/usr/include/ruby-2.4.0/ruby/backward -I/usr/include/ruby-2.4.0 -I. -I/usr/lib/libffi-3.2.1/include -D_FORTIFY_SOURCE=2   -march=armv8-a -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -fPIC  conftest.c  -L. -L/usr/lib -L. -Wl,-O1,--sort-common,--as-needed,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -L/usr/lib/../lib    -lffi  -lffi -lruby -lffi  -lffi -lpthread -lgmp -ldl -lcrypt -lm   -lc"
checked program was:
/* begin */
 1: #include "ruby.h"
 2: 
 3: /*top*/
 4: extern int t(void);
 5: int main(int argc, char **argv)
 6: {
 7:   if (argc > 1000000) {
 8:     printf("%p", &t);
 9:   }
10: 
11:   return 0;
12: }
13: extern void rb_thread_call_with_gvl();
14: int t(void) { rb_thread_call_with_gvl(); return 0; }
/* end */

--------------------

have_func: checking for rb_thread_call_without_gvl()... -------------------- yes

"gcc -o conftest -I/usr/include/ruby-2.4.0/aarch64-linux -I/usr/include/ruby-2.4.0/ruby/backward -I/usr/include/ruby-2.4.0 -I. -I/usr/lib/libffi-3.2.1/include -D_FORTIFY_SOURCE=2   -march=armv8-a -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -fPIC  conftest.c  -L. -L/usr/lib -L. -Wl,-O1,--sort-common,--as-needed,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -L/usr/lib/../lib    -lffi  -lffi -lruby -lffi  -lffi -lpthread -lgmp -ldl -lcrypt -lm   -lc"
conftest.c: In function ‘t’:
conftest.c:13:57: error: ‘rb_thread_call_without_gvl’ undeclared (first use in this function)
 int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_call_without_gvl; return !p; }
                                                         ^~~~~~~~~~~~~~~~~~~~~~~~~~
conftest.c:13:57: note: each undeclared identifier is reported only once for each function it appears in
distcc[555] ERROR: compile conftest.c on localhost failed
checked program was:
/* begin */
 1: #include "ruby.h"
 2: 
 3: /*top*/
 4: extern int t(void);
 5: int main(int argc, char **argv)
 6: {
 7:   if (argc > 1000000) {
 8:     printf("%p", &t);
 9:   }
10: 
11:   return 0;
12: }
13: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_call_without_gvl; return !p; }
/* end */

"gcc -o conftest -I/usr/include/ruby-2.4.0/aarch64-linux -I/usr/include/ruby-2.4.0/ruby/backward -I/usr/include/ruby-2.4.0 -I. -I/usr/lib/libffi-3.2.1/include -D_FORTIFY_SOURCE=2   -march=armv8-a -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -fPIC  conftest.c  -L. -L/usr/lib -L. -Wl,-O1,--sort-common,--as-needed,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -L/usr/lib/../lib    -lffi  -lffi -lruby -lffi  -lffi -lpthread -lgmp -ldl -lcrypt -lm   -lc"
checked program was:
/* begin */
 1: #include "ruby.h"
 2: 
 3: /*top*/
 4: extern int t(void);
 5: int main(int argc, char **argv)
 6: {
 7:   if (argc > 1000000) {
 8:     printf("%p", &t);
 9:   }
10: 
11:   return 0;
12: }
13: extern void rb_thread_call_without_gvl();
14: int t(void) { rb_thread_call_without_gvl(); return 0; }
/* end */

--------------------

have_func: checking for ffi_prep_cif_var()... -------------------- yes

"gcc -o conftest -I/usr/include/ruby-2.4.0/aarch64-linux -I/usr/include/ruby-2.4.0/ruby/backward -I/usr/include/ruby-2.4.0 -I. -I/usr/lib/libffi-3.2.1/include -D_FORTIFY_SOURCE=2   -march=armv8-a -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -fPIC  conftest.c  -L. -L/usr/lib -L. -Wl,-O1,--sort-common,--as-needed,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -L/usr/lib/../lib    -lffi  -lffi -lruby -lffi  -lffi -lpthread -lgmp -ldl -lcrypt -lm   -lc"
conftest.c: In function ‘t’:
conftest.c:13:57: error: ‘ffi_prep_cif_var’ undeclared (first use in this function)
 int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_prep_cif_var; return !p; }
                                                         ^~~~~~~~~~~~~~~~
conftest.c:13:57: note: each undeclared identifier is reported only once for each function it appears in
distcc[565] ERROR: compile conftest.c on localhost failed
checked program was:
/* begin */
 1: #include "ruby.h"
 2: 
 3: /*top*/
 4: extern int t(void);
 5: int main(int argc, char **argv)
 6: {
 7:   if (argc > 1000000) {
 8:     printf("%p", &t);
 9:   }
10: 
11:   return 0;
12: }
13: int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_prep_cif_var; return !p; }
/* end */

"gcc -o conftest -I/usr/include/ruby-2.4.0/aarch64-linux -I/usr/include/ruby-2.4.0/ruby/backward -I/usr/include/ruby-2.4.0 -I. -I/usr/lib/libffi-3.2.1/include -D_FORTIFY_SOURCE=2   -march=armv8-a -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -fPIC  conftest.c  -L. -L/usr/lib -L. -Wl,-O1,--sort-common,--as-needed,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -L/usr/lib/../lib    -lffi  -lffi -lruby -lffi  -lffi -lpthread -lgmp -ldl -lcrypt -lm   -lc"
checked program was:
/* begin */
 1: #include "ruby.h"
 2: 
 3: /*top*/
 4: extern int t(void);
 5: int main(int argc, char **argv)
 6: {
 7:   if (argc > 1000000) {
 8:     printf("%p", &t);
 9:   }
10: 
11:   return 0;
12: }
13: extern void ffi_prep_cif_var();
14: int t(void) { ffi_prep_cif_var(); return 0; }
/* end */

--------------------

extconf.h is:
/* begin */
 1: #ifndef EXTCONF_H
 2: #define EXTCONF_H
 3: #define HAVE_FFI_PREP_CLOSURE 1
 4: #define HAVE_FFI_RAW_CALL 1
 5: #define HAVE_FFI_PREP_RAW_CLOSURE 1
 6: #define HAVE_RAW_API 1
 7: #define HAVE_RB_THREAD_CALL_WITH_GVL 1
 8: #define HAVE_RB_THREAD_CALL_WITHOUT_GVL 1
 9: #define HAVE_FFI_PREP_CIF_VAR 1
10: #define RUBY_1_9 1
11: #endif
/* end */

