# File lib/ffi/library.rb, line 85
  def attach_variable(mname, a1, a2 = nil)
    cname, type = a2 ? [ a1, a2 ] : [ mname.to_s, a1 ]
    libraries = defined?(@ffi_libs) ? @ffi_libs : [ DEFAULT ]
    address = nil
    libraries.each do |lib|
      begin
        address = lib.find_symbol(cname.to_s)
        break unless address.nil?
      rescue LoadError
      end
    end
    raise FFI::NotFoundError.new(cname, libraries) if address.nil?
    case ffi_type = find_type(type)
    when :pointer, FFI::NativeType::POINTER
      op = :pointer
    when :char, FFI::NativeType::INT8
      op = :int8
    when :uchar, FFI::NativeType::UINT8
      op = :uint8
    when :short, FFI::NativeType::INT16
      op = :int16
    when :ushort, FFI::NativeType::UINT16
      op = :uint16
    when :int, FFI::NativeType::INT32
      op = :int32
    when :uint, FFI::NativeType::UINT32
      op = :uint32
    when :long, FFI::NativeType::LONG
      op = :long
    when :ulong, FFI::NativeType::ULONG
      op = :ulong
    when :long_long, FFI::NativeType::INT64
      op = :int64
    when :ulong_long, FFI::NativeType::UINT64
      op = :uint64
    else
      if ffi_type.is_a?(FFI::CallbackInfo)
        op = :callback
      else
        raise FFI::TypeError, "Cannot access library variable of type #{type}"
      end
    end
    #
    # Attach to this module as mname/mname=
    #
    if op == :callback
      self.module_eval "@@ffi_gvar_\#{mname} = address\n@@ffi_gvar_\#{mname}_cbinfo = ffi_type\ndef self.\#{mname}\nraise ArgError, \"Cannot get callback fields\"\nend\ndef self.\#{mname}=(value)\n@@ffi_gvar_\#{mname}.put_callback(0, value, @@ffi_gvar_\#{mname}_cbinfo)\nend\n"
    else
      self.module_eval "@@ffi_gvar_\#{mname} = address\ndef self.\#{mname}\n@@ffi_gvar_\#{mname}.get_\#{op.to_s}(0)\nend\ndef self.\#{mname}=(value)\n@@ffi_gvar_\#{mname}.put_\#{op.to_s}(0, value)\nend\n"
    end
    address
  end