Cygwin上のrubyで共有ライブラリロードエラー


現象

ruby(2.3.3) 上 itamae を実行していて以下のエラーが発生するようになった。

$ itamae ssh ...
/c/Users/xxx/.rbenv/versions/2.3.3/lib/ruby/2.3.0/fiddle/import.rb:86:in `rescue in block in dlload': can't load user32 (Fiddle::DLError)
        from /c/Users/xxx/.rbenv/versions/2.3.3/lib/ruby/2.3.0/fiddle/import.rb:83:in `block in dlload'
        from /c/Users/xxx/.rbenv/versions/2.3.3/lib/ruby/2.3.0/fiddle
...

対応

回避策として、2つのファイルを修正した。
本来なら dlload の中身を直した方が良さそうだけど、取りあえず。
Ruby 2.4.0ではこの部分が修正されているので必要ないらしい(情報源)。

  • ~/.rbenv/versions/2.3.3/lib/ruby/2.3.0/win32/resolv.rb
  • ~/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/net-ssh-4.0.1/lib/net/ssh/authentication/pageant.rb

resolv.rb

~/.rbenv/versions/2.3.3/lib/ruby/2.3.0/win32/resolv.rb
module Kernel32
  extend Importer
  dlload "kernel32"
end

~/.rbenv/versions/2.3.3/lib/ruby/2.3.0/win32/resolv.rb
module Kernel32
  extend Importer
  dlload "kernel32.dll"
end

pageant.rb

~/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/net-ssh-4.0.1/lib/net/ssh/authentication/pageant.rb
        dlload 'user32.dll'
        dlload 'kernel32.dll'
        dlload 'advapi32.dll'
...
        dlload 'user32.dll','kernel32.dll', 'advapi32.dll'

~/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/net-ssh-4.0.1/lib/net/ssh/authentication/pageant.rb
        dlload 'user32.dll'
        dlload 'kernel32.dll'
        dlload 'advapi32.dll'
...
        dlload 'user32.dll','kernel32.dll', 'advapi32.dll'

参考