class FFI::DynamicLibrary

def self.try_load(libname, flags, errors)

def self.try_load(libname, flags, errors)
  begin
    lib = FFI::DynamicLibrary.open(libname, flags)
    return lib if lib
  # LoadError for C ext & JRuby, RuntimeError for TruffleRuby
  rescue LoadError, RuntimeError => ex
    if ex.message =~ /(([^ \t()])+\.so([^ \t:()])*):([ \t])*(invalid ELF header|file too short|invalid file format)/
      if File.binread($1) =~ /(?:GROUP|INPUT) *\( *([^ \)]+)/
        return try_load($1, flags, errors)
      end
    end
    errors << ex
    nil
  end
end