Skip to content

Conversation

@voxik
Copy link
Contributor

@voxik voxik commented Jul 8, 2019

TLDR; Set USE_FFI_CLOSURE_ALLOC=1 by default for better compatibility and improved SELinux support [3]

Recently, we were trying to build Ruby 2.6 on RHEL8, but with the most recent version of libffi including patch for libffi/libffi#470, we started to observe crashes on AArch64 such as:

... snip ...

making mjit_build_dir.so
/builddir/build/BUILD/ruby-2.6.3/.ext/common/fiddle/import.rb:317: [BUG] Segmentation fault at 0x0000000000000018
ruby 2.6.3p62 (2019-04-16 revision 67580) [aarch64-linux]
-- Control frame information -----------------------------------------------
c:0018 p:---- s:0103 e:000102 CFUNC  :initialize
c:0017 p:---- s:0100 e:000099 CFUNC  :new
c:0016 p:0047 s:0093 e:000092 METHOD /builddir/build/BUILD/ruby-2.6.3/.ext/common/fiddle/import.rb:317
c:0015 p:0111 s:0082 e:000081 METHOD /builddir/build/BUILD/ruby-2.6.3/.ext/common/fiddle/import.rb:198
c:0014 p:0107 s:0068 E:001b30 CLASS  /builddir/build/BUILD/ruby-2.6.3/test/fiddle/test_import.rb:25
c:0013 p:0007 s:0065 e:000064 CLASS  /builddir/build/BUILD/ruby-2.6.3/test/fiddle/test_import.rb:10
c:0012 p:0029 s:0062 e:000061 TOP    /builddir/build/BUILD/ruby-2.6.3/test/fiddle/test_import.rb:9 [FINISH]
c:0011 p:---- s:0059 e:000058 CFUNC  :require
c:0010 p:0060 s:0054 e:000053 BLOCK  /builddir/build/BUILD/ruby-2.6.3/test/lib/test/unit.rb:958 [FINISH]
c:0009 p:---- s:0048 e:000047 CFUNC  :each
c:0008 p:0031 s:0044 e:000043 METHOD /builddir/build/BUILD/ruby-2.6.3/test/lib/test/unit.rb:952
c:0007 p:0081 s:0036 e:000035 METHOD /builddir/build/BUILD/ruby-2.6.3/test/lib/test/unit.rb:64
c:0006 p:0020 s:0028 e:000027 METHOD /builddir/build/BUILD/ruby-2.6.3/test/lib/test/unit.rb:130
c:0005 p:0010 s:0022 e:000021 METHOD /builddir/build/BUILD/ruby-2.6.3/test/lib/test/unit.rb:1136
c:0004 p:0012 s:0017 e:000016 METHOD /builddir/build/BUILD/ruby-2.6.3/test/lib/test/unit.rb:1141
c:0003 p:0011 s:0013 e:000012 METHOD /builddir/build/BUILD/ruby-2.6.3/test/lib/test/unit.rb:1148
c:0002 p:0263 s:0008 E:001d28 EVAL   ./test/runner.rb:33 [FINISH]
c:0001 p:0000 s:0003 E:0004e0 (none) [FINISH]
-- Ruby level backtrace information ----------------------------------------
./test/runner.rb:33:in `<main>'
/builddir/build/BUILD/ruby-2.6.3/test/lib/test/unit.rb:1148:in `run'
/builddir/build/BUILD/ruby-2.6.3/test/lib/test/unit.rb:1141:in `run'
/builddir/build/BUILD/ruby-2.6.3/test/lib/test/unit.rb:1136:in `process_args'
/builddir/build/BUILD/ruby-2.6.3/test/lib/test/unit.rb:130:in `process_args'
/builddir/build/BUILD/ruby-2.6.3/test/lib/test/unit.rb:64:in `process_args'
/builddir/build/BUILD/ruby-2.6.3/test/lib/test/unit.rb:952:in `non_options'
/builddir/build/BUILD/ruby-2.6.3/test/lib/test/unit.rb:952:in `each'
/builddir/build/BUILD/ruby-2.6.3/test/lib/test/unit.rb:958:in `block in non_options'
/builddir/build/BUILD/ruby-2.6.3/test/lib/test/unit.rb:958:in `require'
/builddir/build/BUILD/ruby-2.6.3/test/fiddle/test_import.rb:9:in `<top (required)>'
/builddir/build/BUILD/ruby-2.6.3/test/fiddle/test_import.rb:10:in `<module:Fiddle>'
/builddir/build/BUILD/ruby-2.6.3/test/fiddle/test_import.rb:25:in `<module:LIBC>'
/builddir/build/BUILD/ruby-2.6.3/.ext/common/fiddle/import.rb:198:in `bind'
/builddir/build/BUILD/ruby-2.6.3/.ext/common/fiddle/import.rb:317:in `bind_function'
/builddir/build/BUILD/ruby-2.6.3/.ext/common/fiddle/import.rb:317:in `new'
/builddir/build/BUILD/ruby-2.6.3/.ext/common/fiddle/import.rb:317:in `initialize'
-- C level backtrace information -------------------------------------------
/builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3(rb_print_backtrace+0x20) [0xffffbe6794f8] vm_dump.c:715
/builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3(rb_vm_bugreport+0x8c) [0xffffbe679594] vm_dump.c:985
/builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3(rb_bug_context+0xc4) [0xffffbe52bcac] error.c:609
/builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3(sigsegv+0x4c) [0xffffbe6059fc] signal.c:998
linux-vdso.so.1(__kernel_rt_sigreturn+0x0) [0xffffbe7c066c]
[0xffffbb8b4398]
[0xffffbb8b5b74]
[0xffffbb8e3340]
/builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3(rb_vm_call0+0x284) [0xffffbe66ec24] vm_eval.c:86
/builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3(rb_class_s_new+0x30) [0xffffbe59eb30] object.c:2187
/builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3(vm_call_cfunc+0x120) [0xffffbe6625b0] vm_insnhelper.c:1908
/builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3(vm_call_method+0x68) [0xffffbe66cd18] vm_insnhelper.c:2369
/builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3(vm_exec_core+0x128) [0xffffbe666710] insns.def:765
/builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3(rb_vm_exec+0x1d4) [0xffffbe66b7ec] vm.c:1894
/builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3(rb_load_internal0+0xe4) [0xffffbe5702d4] load.c:612
/builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3(rb_require_internal+0x4e4) [0xffffbe571afc] load.c:1029
/builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3(rb_require_safe+0x14) [0xffffbe571bb4] load.c:1075
/builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3(vm_call_cfunc+0x120) [0xffffbe6625b0] vm_insnhelper.c:1908
/builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3(vm_exec_core+0x128) [0xffffbe666710] insns.def:765
/builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3(rb_vm_exec+0x1d4) [0xffffbe66b7ec] vm.c:1894
/builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3(rb_yield+0x1f4) [0xffffbe67295c] vm.c:1021
/builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3(rb_ary_each+0x3c) [0xffffbe4c427c] array.c:2086
/builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3(vm_call_cfunc+0x120) [0xffffbe6625b0] vm_insnhelper.c:1908
/builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3(vm_call_method+0x68) [0xffffbe66cd18] vm_insnhelper.c:2369
/builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3(vm_exec_core+0x1bc) [0xffffbe6667a4] insns.def:750
/builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3(rb_vm_exec+0x1d4) [0xffffbe66b7ec] vm.c:1894
/builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3(ruby_exec_internal+0xd4) [0xffffbe52fc5c] eval.c:262
/builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3(ruby_exec_node+0x1c) [0xffffbe531d0c] eval.c:326
/builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3(ruby_run_node+0x38) [0xffffbe534418] eval.c:318
/builddir/build/BUILD/ruby-2.6.3/ruby(main+0x60) [0xaaaaaaaa0b80] ./main.c:42
RPM build errors:
-- Other runtime information -----------------------------------------------
* Loaded script: ./test/runner.rb
* Loaded features:
    0 enumerator.so
    1 thread.rb
    2 rational.so
    3 complex.so
    4 /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/enc/encdb.so
    5 /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/enc/trans/transdb.so
    6 /builddir/build/BUILD/ruby-2.6.3/rbconfig.rb
    7 /builddir/build/BUILD/ruby-2.6.3/lib/optparse.rb
    8 /builddir/build/BUILD/ruby-2.6.3/test/lib/leakchecker.rb
    9 /builddir/build/BUILD/ruby-2.6.3/test/lib/minitest/unit.rb
   10 /builddir/build/BUILD/ruby-2.6.3/lib/prettyprint.rb
   11 /builddir/build/BUILD/ruby-2.6.3/lib/pp.rb
   12 /builddir/build/BUILD/ruby-2.6.3/test/lib/test/unit/assertions.rb
   13 /builddir/build/BUILD/ruby-2.6.3/lib/open3.rb
   14 /builddir/build/BUILD/ruby-2.6.3/lib/timeout.rb
   15 /builddir/build/BUILD/ruby-2.6.3/test/lib/find_executable.rb
   16 /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/rbconfig/sizeof.so
   17 /builddir/build/BUILD/ruby-2.6.3/test/lib/envutil.rb
   18 /builddir/build/BUILD/ruby-2.6.3/test/lib/test/unit/testcase.rb
   19 /builddir/build/BUILD/ruby-2.6.3/test/lib/test/unit.rb
   20 /builddir/build/BUILD/ruby-2.6.3/test/lib/tracepointchecker.rb
   21 /builddir/build/BUILD/ruby-2.6.3/test/lib/zombie_hunter.rb
   22 /builddir/build/BUILD/ruby-2.6.3/lib/delegate.rb
   23 /builddir/build/BUILD/ruby-2.6.3/lib/fileutils/version.rb
   24 /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/etc.so
   25 /builddir/build/BUILD/ruby-2.6.3/lib/fileutils.rb
   26 /builddir/build/BUILD/ruby-2.6.3/lib/tmpdir.rb
   27 /builddir/build/BUILD/ruby-2.6.3/lib/tempfile.rb
   28 /builddir/build/BUILD/ruby-2.6.3/test/lib/iseq_loader_checker.rb
   29 /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/digest.so
   30 /builddir/build/BUILD/ruby-2.6.3/.ext/common/digest.rb
   31 /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/digest/md5.so
   32 /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/digest/rmd160.so
   33 /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/digest/sha1.so
   34 /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/digest/sha2.so
   35 /builddir/build/BUILD/ruby-2.6.3/.ext/common/digest/sha2.rb
   36 /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/digest/bubblebabble.so
   37 /builddir/build/BUILD/ruby-2.6.3/test/digest/test_digest.rb
   38 /builddir/build/BUILD/ruby-2.6.3/test/lib/with_different_ofs.rb
   39 /builddir/build/BUILD/ruby-2.6.3/test/digest/test_digest_extend.rb
   40 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/versions.rb
   41 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/exception.rb
   42 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/syntax_error.rb
   43 /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/psych.so
   44 /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/stringio.so
   45 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/omap.rb
   46 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/set.rb
   47 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/class_loader.rb
   48 /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/strscan.so
   49 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/scalar_scanner.rb
   50 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/nodes/node.rb
   51 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/nodes/stream.rb
   52 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/nodes/document.rb
   53 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/nodes/sequence.rb
   54 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/nodes/scalar.rb
   55 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/nodes/mapping.rb
   56 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/nodes/alias.rb
   57 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/nodes.rb
   58 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/streaming.rb
   59 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/visitors/visitor.rb
   60 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/visitors/to_ruby.rb
   61 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/visitors/emitter.rb
   62 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/handler.rb
   63 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/tree_builder.rb
   64 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/visitors/yaml_tree.rb
   65 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/json/ruby_events.rb
   66 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/visitors/json_tree.rb
   67 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/visitors/depth_first.rb
   68 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/visitors.rb
   69 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/parser.rb
   70 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/coder.rb
   71 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/core_ext.rb
   72 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/stream.rb
   73 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/json/yaml_events.rb
   74 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/json/tree_builder.rb
   75 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/json/stream.rb
   76 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych/handlers/document_stream.rb
   77 /builddir/build/BUILD/ruby-2.6.3/.ext/common/psych.rb
   78 /builddir/build/BUILD/ruby-2.6.3/lib/yaml.rb
   79 /builddir/build/BUILD/ruby-2.6.3/lib/pstore.rb
   80 /builddir/build/BUILD/ruby-2.6.3/lib/yaml/store.rb
   81 /builddir/build/BUILD/ruby-2.6.3/test/yaml/test_store.rb
   82 /builddir/build/BUILD/ruby-2.6.3/test/test_pstore.rb
   83 /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/zlib.so
   84 /builddir/build/BUILD/ruby-2.6.3/test/zlib/test_zlib.rb
   85 /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/fiddle.so
   86 /builddir/build/BUILD/ruby-2.6.3/.ext/common/fiddle/function.rb
   87 /builddir/build/BUILD/ruby-2.6.3/.ext/common/fiddle/closure.rb
   88 /builddir/build/BUILD/ruby-2.6.3/.ext/common/fiddle.rb
   89 /builddir/build/BUILD/ruby-2.6.3/test/fiddle/helper.rb
   90 /builddir/build/BUILD/ruby-2.6.3/test/fiddle/test_closure.rb
   91 /builddir/build/BUILD/ruby-2.6.3/.ext/common/fiddle/value.rb
   92 /builddir/build/BUILD/ruby-2.6.3/.ext/common/fiddle/pack.rb
   93 /builddir/build/BUILD/ruby-2.6.3/.ext/common/fiddle/struct.rb
   94 /builddir/build/BUILD/ruby-2.6.3/test/fiddle/test_c_union_entity.rb
   95 /builddir/build/BUILD/ruby-2.6.3/.ext/common/fiddle/cparser.rb
   96 /builddir/build/BUILD/ruby-2.6.3/.ext/common/fiddle/import.rb
* Process memory map:
aaaaaaaa0000-aaaaaaab0000 r-xp 00000000 08:05 133460                     /builddir/build/BUILD/ruby-2.6.3/ruby
aaaaaaab0000-aaaaaaac0000 r--p 00000000 08:05 133460                     /builddir/build/BUILD/ruby-2.6.3/ruby
aaaaaaac0000-aaaaaaad0000 rw-p 00010000 08:05 133460                     /builddir/build/BUILD/ruby-2.6.3/ruby
aaaaaaad0000-aaaaab0e0000 rw-p 00000000 00:00 0                          [heap]
ffffba7b0000-ffffbb840000 r--s 00000000 08:05 133443                     /builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3
ffffbb840000-ffffbb860000 r--s 00000000 08:05 133460                     /builddir/build/BUILD/ruby-2.6.3/ruby
ffffbb860000-ffffbb880000 r-xp 00000000 08:05 5636615                    /usr/lib64/libgcc_s-8-20190507.so.1
ffffbb880000-ffffbb890000 r--p 00010000 08:05 5636615                    /usr/lib64/libgcc_s-8-20190507.so.1
ffffbb890000-ffffbb8a0000 rw-p 00020000 08:05 5636615                    /usr/lib64/libgcc_s-8-20190507.so.1
ffffbb8b0000-ffffbb8c0000 r-xp 00000000 08:05 5639808                    /usr/lib64/libffi.so.6.0.2
ffffbb8c0000-ffffbb8d0000 r--p 00000000 08:05 5639808                    /usr/lib64/libffi.so.6.0.2
ffffbb8d0000-ffffbb8e0000 rw-p 00010000 08:05 5639808                    /usr/lib64/libffi.so.6.0.2
ffffbb8e0000-ffffbb8f0000 r-xp 00000000 08:05 791427                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/fiddle.so
ffffbb8f0000-ffffbb900000 r--p 00000000 08:05 791427                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/fiddle.so
ffffbb900000-ffffbb910000 rw-p 00000000 00:00 0 
ffffbb910000-ffffbb920000 r-xp 00000000 08:05 791464                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/zlib.so
ffffbb920000-ffffbb930000 r--p 00000000 08:05 791464                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/zlib.so
ffffbb930000-ffffbb940000 rw-p 00000000 00:00 0 
ffffbb940000-ffffbb950000 r-xp 00000000 08:05 791657                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/strscan.so
ffffbb950000-ffffbb960000 r--p 00000000 08:05 791657                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/strscan.so
ffffbb960000-ffffbb970000 rw-p 00000000 00:00 0 
ffffbb970000-ffffbb980000 r-xp 00000000 08:05 791669                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/stringio.so
ffffbb980000-ffffbb990000 r--p 00000000 08:05 791669                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/stringio.so
ffffbb990000-ffffbb9a0000 rw-p 00000000 00:00 0 
ffffbb9a0000-ffffbb9c0000 r-xp 00000000 08:05 5644502                    /usr/lib64/libyaml-0.so.2.0.5
ffffbb9c0000-ffffbb9d0000 r--p 00010000 08:05 5644502                    /usr/lib64/libyaml-0.so.2.0.5
ffffbb9d0000-ffffbb9e0000 rw-p 00020000 08:05 5644502                    /usr/lib64/libyaml-0.so.2.0.5
ffffbb9e0000-ffffbb9f0000 r-xp 00000000 08:05 791739                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/psych.so
ffffbb9f0000-ffffbba00000 r--p 00000000 08:05 791739                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/psych.so
ffffbba00000-ffffbba10000 rw-p 00000000 00:00 0 
ffffbba10000-ffffbba20000 r-xp 00000000 08:05 791731                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/digest/bubblebabble.so
ffffbba20000-ffffbba30000 r--p 00000000 08:05 791731                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/digest/bubblebabble.so
ffffbba30000-ffffbba40000 rw-p 00000000 00:00 0 
ffffbba40000-ffffbba50000 r-xp 00000000 08:05 791750                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/digest/sha2.so
ffffbba50000-ffffbba60000 r--p 00000000 08:05 791750                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/digest/sha2.so
ffffbba60000-ffffbba70000 rw-p 00000000 00:00 0 
ffffbba70000-ffffbba80000 r-xp 00000000 08:05 791747                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/digest/sha1.so
ffffbba80000-ffffbba90000 r--p 00000000 08:05 791747                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/digest/sha1.so
ffffbba90000-ffffbbaa0000 rw-p 00000000 00:00 0 
ffffbbaa0000-ffffbbab0000 r-xp 00000000 08:05 791746                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/digest/rmd160.so
ffffbbab0000-ffffbbac0000 r--p 00000000 08:05 791746                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/digest/rmd160.so
ffffbbac0000-ffffbbad0000 rw-p 00000000 00:00 0 
ffffbbad0000-ffffbbaf0000 r-xp 00000000 08:05 5639757                    /usr/lib64/libz.so.1.2.11
ffffbbaf0000-ffffbbb00000 r--p 00010000 08:05 5639757                    /usr/lib64/libz.so.1.2.11
ffffbbb00000-ffffbbb10000 rw-p 00000000 00:00 0 
ffffbbb10000-ffffbbd80000 r-xp 00000000 08:05 5640526                    /usr/lib64/libcrypto.so.1.1.1c
ffffbbd80000-ffffbbdb0000 r--p 00260000 08:05 5640526                    /usr/lib64/libcrypto.so.1.1.1c
ffffbbdb0000-ffffbbdc0000 rw-p 00290000 08:05 5640526                    /usr/lib64/libcrypto.so.1.1.1c
ffffbbdc0000-ffffbbe40000 r-xp 00000000 08:05 5640528                    /usr/lib64/libssl.so.1.1.1c
ffffbbe40000-ffffbbe50000 ---p 00080000 08:05 5640528                    /usr/lib64/libssl.so.1.1.1c
ffffbbe50000-ffffbbe60000 r--p 00080000 08:05 5640528                    /usr/lib64/libssl.so.1.1.1c
ffffbbe60000-ffffbbe70000 rw-p 00090000 08:05 5640528                    /usr/lib64/libssl.so.1.1.1c
ffffbbe70000-ffffbbe80000 r-xp 00000000 08:05 791717                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/digest/md5.so
ffffbbe80000-ffffbbe90000 r--p 00000000 08:05 791717                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/digest/md5.so
ffffbbe90000-ffffbbea0000 rw-p 00000000 00:00 0 
ffffbbea0000-ffffbbeb0000 r-xp 00000000 08:05 791030                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/digest.so
ffffbbeb0000-ffffbbec0000 r--p 00000000 08:05 791030                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/digest.so
ffffbbec0000-ffffbbed0000 rw-p 00000000 00:00 0 
ffffbbed0000-ffffbbee0000 r-xp 00000000 08:05 791621                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/etc.so
ffffbbee0000-ffffbbef0000 r--p 00000000 08:05 791621                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/etc.so
ffffbbef0000-ffffbbf00000 rw-p 00000000 00:00 0 
ffffbbf00000-ffffbbf10000 r-xp 00000000 08:05 791741                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/rbconfig/sizeof.so
ffffbbf10000-ffffbbf20000 r--p 00000000 08:05 791741                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/rbconfig/sizeof.so
ffffbbf20000-ffffbbf30000 rw-p 00000000 00:00 0 
ffffbbf30000-ffffbbf40000 r-xp 00000000 08:05 790805                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/enc/trans/transdb.so
ffffbbf40000-ffffbbf50000 r--p 00000000 08:05 790805                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/enc/trans/transdb.so
ffffbbf50000-ffffbbf60000 rw-p 00000000 00:00 0 
ffffbbf60000-ffffbbf70000 r-xp 00000000 08:05 790740                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/enc/encdb.so
ffffbbf70000-ffffbbf80000 r--p 00000000 08:05 790740                     /builddir/build/BUILD/ruby-2.6.3/.ext/aarch64-linux/enc/encdb.so
ffffbbf80000-ffffbe0b0000 rw-p 00000000 00:00 0 
ffffbe0b0000-ffffbe210000 r-xp 00000000 08:05 5639381                    /usr/lib64/libc-2.28.so
ffffbe210000-ffffbe220000 r--p 00150000 08:05 5639381                    /usr/lib64/libc-2.28.so
ffffbe220000-ffffbe230000 rw-p 00160000 08:05 5639381                    /usr/lib64/libc-2.28.so
ffffbe230000-ffffbe2e0000 r-xp 00000000 08:05 5639385                    /usr/lib64/libm-2.28.so
ffffbe2e0000-ffffbe2f0000 r--p 000a0000 08:05 5639385                    /usr/lib64/libm-2.28.so
ffffbe2f0000-ffffbe300000 rw-p 000b0000 08:05 5639385                    /usr/lib64/libm-2.28.so
ffffbe300000-ffffbe320000 r-xp 00000000 08:05 5639780                    /usr/lib64/libcrypt.so.1.1.0
ffffbe320000-ffffbe330000 r--p 00010000 08:05 5639780                    /usr/lib64/libcrypt.so.1.1.0
ffffbe330000-ffffbe340000 rw-p 00000000 00:00 0 
ffffbe340000-ffffbe350000 r-xp 00000000 08:05 5639383                    /usr/lib64/libdl-2.28.so
ffffbe350000-ffffbe360000 r--p 00000000 08:05 5639383                    /usr/lib64/libdl-2.28.so
ffffbe360000-ffffbe370000 rw-p 00010000 08:05 5639383                    /usr/lib64/libdl-2.28.so
ffffbe370000-ffffbe3e0000 r-xp 00000000 08:05 5639770                    /usr/lib64/libgmp.so.10.3.2
ffffbe3e0000-ffffbe3f0000 ---p 00070000 08:05 5639770                    /usr/lib64/libgmp.so.10.3.2
ffffbe3f0000-ffffbe400000 r--p 00070000 08:05 5639770                    /usr/lib64/libgmp.so.10.3.2
ffffbe400000-ffffbe410000 rw-p 00080000 08:05 5639770                    /usr/lib64/libgmp.so.10.3.2
ffffbe410000-ffffbe420000 r-xp 00000000 08:05 5639397                    /usr/lib64/librt-2.28.so
ffffbe420000-ffffbe430000 r--p 00000000 08:05 5639397                    /usr/lib64/librt-2.28.so
ffffbe430000-ffffbe440000 rw-p 00010000 08:05 5639397                    /usr/lib64/librt-2.28.so
ffffbe440000-ffffbe460000 r-xp 00000000 08:05 5639393                    /usr/lib64/libpthread-2.28.so
ffffbe460000-ffffbe470000 r--p 00010000 08:05 5639393                    /usr/lib64/libpthread-2.28.so
ffffbe470000-ffffbe480000 rw-p 00020000 08:05 5639393                    /usr/lib64/libpthread-2.28.so
ffffbe480000-ffffbe490000 rw-p 00000000 00:00 0 
ffffbe490000-ffffbe770000 r-xp 00000000 08:05 133443                     /builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3
ffffbe770000-ffffbe780000 ---p 002e0000 08:05 133443                     /builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3
ffffbe780000-ffffbe790000 r--p 002e0000 08:05 133443                     /builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3
ffffbe790000-ffffbe7a0000 rw-p 002f0000 08:05 133443                     /builddir/build/BUILD/ruby-2.6.3/libruby.so.2.6.3
ffffbe7a0000-ffffbe7b0000 rw-p 00000000 00:00 0 
ffffbe7b0000-ffffbe7c0000 r--p 00000000 00:00 0                          [vvar]
ffffbe7c0000-ffffbe7d0000 r-xp 00000000 00:00 0                          [vdso]
ffffbe7d0000-ffffbe7f0000 r-xp 00000000 08:05 5639374                    /usr/lib64/ld-2.28.so
ffffbe7f0000-ffffbe800000 r--p 00010000 08:05 5639374                    /usr/lib64/ld-2.28.so
ffffbe800000-ffffbe810000 rw-p 00020000 08:05 5639374                    /usr/lib64/ld-2.28.so
ffffff800000-1000000000000 rw-p 00000000 00:00 0                         [stack]
[NOTE]
You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.
For details: https://www.ruby-lang.org/bugreport.html
make: *** [uncommon.mk:768: yes-test-almost] Aborted

The simplest reproducer is:

$ ruby -r 'fiddle.so' -e 'Fiddle::Closure.new(1, [1, 1], 1)'

As far as I can tell, there were similar issues already, such as [1, 2]. We were considering to modify the build options to include -DUSE_FFI_CLOSURE_ALLOC=1, but now I think this should be changed upstream by defauld for the following reasons:

  1. It is not clear why ffi_closure_free should not be used on the first place. It seems that the conditional there is just heritage, where older versions of libffi have not supported the ffi_closure_free function everywhere.
  2. The use of ffi_closure_free should provide better SELinux compatibility [3]
  3. The macro is unreadable and it is not clear under what conditions is the ffi_closure_free used.

The PR changes to use the ffi_closure_free every time except for the old libffi. Should there be some exceptions, it should be properly understood and documented.

@kou
Copy link
Member

kou commented Jul 8, 2019

We can always use ffi_closure_free() because libffi 3.0.5 (it fixes the ffi_closure_free() bug) or later is widely used now.
For example, CentOS 6 ships libffi 3.0.5: http://vault.centos.org/centos/6/os/Source/SPackages/libffi-3.0.5-3.2.el6.src.rpm

@voxik voxik force-pushed the ffi_closure_free branch from 17060f5 to a1dead6 Compare July 9, 2019 05:20
@voxik
Copy link
Contributor Author

voxik commented Jul 9, 2019

I have fixed an silly bug in the PR and updated a commit message a bit.

Do you think I should update the PR to use the ffi_closure_free() unconditionally? I think the new condition is simple, while it still provides optional fallback for those unfortunate having to use old libffi.

@kou
Copy link
Member

kou commented Jul 9, 2019

Do you think I should update the PR to use the ffi_closure_free() unconditionally?

Yes.

it still provides optional fallback for those unfortunate having to use old libffi.

We should remove USE_FFI_CLOSURE_ALLOC related codes too.

The current conditionals reflect historic heritage of FFI. Usage of
ffi_closure_free should be better default nowadays, because libffi 3.0.5
fixing issues of ffi_closure_free should be widely available.
@voxik voxik force-pushed the ffi_closure_free branch from a1dead6 to 0cb8b4a Compare July 9, 2019 12:26
@voxik
Copy link
Contributor Author

voxik commented Jul 9, 2019

I have update the PR to use the ffi_closure_free() unconditionally.

Just FTR, the RUBY_LIBFFI_MODVERSION has no use ATM.

@kou
Copy link
Member

kou commented Jul 10, 2019

Just FTR, the RUBY_LIBFFI_MODVERSION has no use ATM.

Could you also remove RUBY_LIBFFI_MODVERSION related codes from extconf.rb?

voxik added 2 commits July 10, 2019 14:41
Because `ffi_closure_free()` is not used unconditionally, there is no
other use for RUBY_LIBFFI_MODVERSION define, so drop its usage.
`ver` variable used to be used to pupulate RUBY_LIBFFI_MODVERSION
define. Since the define was removed, the `libffi_dir` variable name
should better describe the remaining usage of the variable.
@voxik
Copy link
Contributor Author

voxik commented Jul 10, 2019

I have added commit removing the RUBY_LIBFFI_MODVERSION define as well as small commit refactoring improving the variable names. Feel free to cherry pick.

Copy link
Member

@kou kou left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!
I'll merge this.

@kou kou merged commit c49cc79 into ruby:master Jul 10, 2019
@mame
Copy link
Member

mame commented Mar 4, 2020

Hi @voxik @kou

This change was reverted because it fails to build on macOS.
https://rubyci.org/logs/rubyci.s3.amazonaws.com/osx1014/ruby-master/log/20200304T074503Z.log.html.gz#test%2Ffiddle

+ make 'TESTS=--hide-skip -v fiddle' RUBYOPT=-w test-all
dyld: lazy symbol binding failed: Symbol not found: _ffi_closure_alloc
  Referenced from: /Users/hsbt/Documents/cb/tmp/build/20200304T074503Z/ruby/.ext/x86_64-darwin18/fiddle.bundle
  Expected in: flat namespace

dyld: Symbol not found: _ffi_closure_alloc
  Referenced from: /Users/hsbt/Documents/cb/tmp/build/20200304T074503Z/ruby/.ext/x86_64-darwin18/fiddle.bundle
  Expected in: flat namespace

make: *** [yes-test-all] Abort trap: 6
exit 2
failed(test/fiddle)

Could you check it out?

nobu pushed a commit to nobu/fiddle that referenced this pull request Apr 29, 2020
This reverts commit ce6caade7c57a505f73086ccd7b33c14f7715f22.
kou pushed a commit that referenced this pull request Apr 29, 2020
* Revert "[ruby/fiddle] Use ffi_closure_free by default. (#20)"

This reverts commit ce6caade7c57a505f73086ccd7b33c14f7715f22.

* Revert "[ruby/fiddle] test: use env Hash"

This reverts commit 4d844cbaed518743776594fa5ae33b86fe176ad1.

* Deprecate taint/trust and related methods, and make the methods no-ops

This removes the related tests, and puts the related specs behind
version guards.  This affects all code in lib, including some
libraries that may want to support older versions of Ruby.

* More fixes for $SAFE/taint post merging

* Fix "cannot find the function: strcpy()" error on arm32 on Travis CI. (#2686)

This issue happened when `libc.so` and `libm.so` path were not found
and `ldd ruby` command also failed to print the shared dependencies
in `test/fiddle/helper.rb`.

See https://travis-ci.org/ruby/ruby/jobs/611483288#L3018
/home/travis/build/ruby/ruby/build/.ext/common/fiddle/import.rb:299:in `import_function': cannot find the function: strcpy() (Fiddle::DLError)

* Set libc6:armhf as a installing dependency explicitly.
* Remove arm32 from allow_failures.

* Drop executable bit of *.{yml,h,mk.tmpl}

* pass appropriate libc path

The same as ruby/ruby#2686, but for musl libc.
Musl is not named as libc.so.6 so the `ldd` hack implemented some lines
below does not work.

* Use ffi_closure_free if available

* ffi_closure_free is available in the bundled libffi

* Fixed never-defined symbol name

* use ffi_closure_alloc only with 3.2 or later

* always use ffi_closure_alloc on Windows

* Fixed a typo

* Switch to download libffi source package to github releases from sourceware.org

* Use osuosl instead of GitHub releases

  Because the package provided by GitHub releases is different from sourceware.

* Do not set USE_FFI_CLOSURE_ALLOC=1 in fiddle on OpenBSD

On OpenBSD, USE_FFI_CLOSURE_ALLOC was always set to 0 previously. In
633a1f15d8228236094ddee12e4e169d655ec49e, the code was modified in a
way that it ended up being set to 1 on OpenBSD.  However, that results
in SIGABRT when running make test-all, inside ffi_closure_free.
Setting USE_FFI_CLOSURE_ALLOC back to 0 fixes the issue.

* Show libffi version only if set

* Fix helper to not assume glibc

* `Dir.glob` always returns an array

It is not needed to test itself, but the element should be tested
instead.

Co-authored-by: Hiroshi SHIBATA <hsbt@ruby-lang.org>
Co-authored-by: Jeremy Evans <code@jeremyevans.net>
Co-authored-by: Jun Aruga <junaruga@users.noreply.github.com>
Co-authored-by: Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
Co-authored-by: 卜部昌平 <shyouhei@ruby-lang.org>
Co-authored-by: Paul Jordan <paullj1@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants