首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Fiddle

Ruby的libffi包装器。

描述

Fiddle 是用 ruby翻译外国功能界面(FFI)的扩展。

它包装了libffi,这是一个流行的C库,它提供了一个便携式界面,允许用一种语言编写的代码调用用其他语言编写的代码。

在这里,我们将使用Fiddle :: Function 从libm中包装floor(3)

代码语言:javascript
复制
require 'fiddle'

libm = Fiddle.dlopen('/lib/libm.so.6')

floor = Fiddle::Function.new(
  libm['floor'],
  [Fiddle::TYPE_DOUBLE],
  Fiddle::TYPE_DOUBLE
)

puts floor.call(3.14159) #=> 3.0

常量

ALIGN_CHAR

ALIGN_CHAR

字符的对齐大小

ALIGN_DOUBLE

ALIGN_DOUBLE

双重对齐大小

ALIGN_FLOAT

ALIGN_FLOAT

浮动的对齐大小

ALIGN_INT

ALIGN_INT

int的对齐大小

ALIGN_INTPTR_T

ALIGN_INTPTR_T

intptr_t的对齐大小

ALIGN_LONG

ALIGN_LONG

long的对齐大小

ALIGN_LONG_LONG

ALIGN_LONG_LONG

long long的队列大小

ALIGN_PTRDIFF_T

ALIGN_PTRDIFF_T

ptrdiff_t的对齐大小

ALIGN_SHORT

ALIGN_SHORT

short的对齐大小

ALIGN_SIZE_T

ALIGN_SIZE_T

size_t的对齐大小

ALIGN_SSIZE_T

ALIGN_SSIZE_T

ssize_t的对齐大小

ALIGN_UINTPTR_T

ALIGN_UINTPTR_T

uintptr_t的对齐大小

ALIGN_VOIDP

ALIGN_VOIDP

void *的对齐大小

BUILD_RUBY_PLATFORM

BUILD_RUBY_PLATFORM

针对(即“x86_64-linux”等)构建的平台,

另见RUBY_PLATFORM

RUBY_FREE

RUBY_FREE

ruby_xfree()函数的地址

SIZEOF_CHAR

SIZEOF_CHAR

字符的大小

SIZEOF_DOUBLE

SIZEOF_DOUBLE

double的大小

SIZEOF_FLOAT

SIZEOF_FLOAT

float的大小

SIZEOF_INT

SIZEOF_INT

int的大小

SIZEOF_INTPTR_T

SIZEOF_INTPTR_T

intptr_t的大小

SIZEOF_LONG

SIZEOF_LONG

long的大小

SIZEOF_LONG_LONG

SIZEOF_LONG_LONG

long long的大小

SIZEOF_PTRDIFF_T

SIZEOF_PTRDIFF_T

ptrdiff_t的大小

SIZEOF_SHORT

SIZEOF_SHORT

short的大小

SIZEOF_SIZE_T

SIZEOF_SIZE_T

size_t的大小

SIZEOF_SSIZE_T

SIZEOF_SSIZE_T

ssize_t的大小

SIZEOF_UINTPTR_T

SIZEOF_UINTPTR_T

uintptr_t的大小

SIZEOF_VOIDP

SIZEOF_VOIDP

void*的大小

TYPE_CHAR

TYPE_CHAR

C type - char

TYPE_DOUBLE

TYPE_DOUBLE

C type - double

TYPE_FLOAT

TYPE_FLOAT

C type - float

TYPE_INT

TYPE_INT

C type - int

TYPE_INTPTR_T

TYPE_INTPTR_T

C type - intptr_t

TYPE_LONG

TYPE_LONG

C type - long

TYPE_LONG_LONG

TYPE_LONG_LONG

C type - long long

TYPE_PTRDIFF_T

TYPE_PTRDIFF_T

C type - ptrdiff_t

TYPE_SHORT

TYPE_SHORT

C type - short

TYPE_SIZE_T

TYPE_SIZE_T

C type - size_t

TYPE_SSIZE_T

TYPE_SSIZE_T

C type - ssize_t

TYPE_UINTPTR_T

TYPE_UINTPTR_T

C type - uintptr_t

TYPE_VOID

TYPE_VOID

C type - void

TYPE_VOIDP

TYPE_VOIDP

C type - void*

WINDOWS

返回一个关于主机是否为WIN32的布尔值

公共类方法

dlopen(library) → Fiddle::Handle Show source

创建一个打开库的新处理程序,并返回Fiddle :: Handle的一个实例。

如果为库指定了nil,则使用Fiddle :: Handle :: DEFAULT,这等同于RTLD_DEFAULT。 请参阅 man 3 dlopen。

代码语言:javascript
复制
lib = Fiddle.dlopen(nil)

缺省值取决于操作系统,并为已加载的所有库提供句柄。 例如,在大多数情况下,您可以使用它来访问libc函数或ruby函数,如rb_str_new。

有关更多信息,请参阅Fiddle :: Handle.new。

代码语言:javascript
复制
# File ext/fiddle/lib/fiddle.rb, line 45
def dlopen library
  Fiddle::Handle.new library
end

dlunwrap(addr) Show source

返回内存指针地址 addr的十六进制表示

例:

代码语言:javascript
复制
lib = Fiddle.dlopen('/lib64/libc-2.15.so')
=> #<Fiddle::Handle:0x00000001342460>

lib['strcpy'].to_s(16)
=> "7f59de6dd240"

Fiddle.dlunwrap(Fiddle.dlwrap(lib['strcpy'].to_s(16)))
=> "7f59de6dd240"
代码语言:javascript
复制
VALUE
rb_fiddle_ptr2value(VALUE self, VALUE addr)
{
    return (VALUE)NUM2PTR(addr);
}

dlwrap(val) Show source

返回函数十六进制地址位置val的内存指针

例:

代码语言:javascript
复制
lib = Fiddle.dlopen('/lib64/libc-2.15.so')
=> #<Fiddle::Handle:0x00000001342460>

Fiddle.dlwrap(lib['strcpy'].to_s(16))
=> 25522520
代码语言:javascript
复制
static VALUE
rb_fiddle_value2ptr(VALUE self, VALUE val)
{
    return PTR2NUM((void*)val);
}

free(addr) Show source

释放地址处的内存 addr

代码语言:javascript
复制
VALUE
rb_fiddle_free(VALUE self, VALUE addr)
{
    void *ptr = NUM2PTR(addr);

    ruby_xfree(ptr);
    return Qnil;
}

last_error() Show source

返回当前正在执行的线程的最后一个错误,如果没有则返回nil

代码语言:javascript
复制
# File ext/fiddle/lib/fiddle.rb, line 20
def self.last_error
  Thread.current[:__FIDDLE_LAST_ERROR__]
end

last_error=(error) Show source

将当前正在执行的线程的最后一个错误设置为错误

代码语言:javascript
复制
# File ext/fiddle/lib/fiddle.rb, line 25
def self.last_error= error
  Thread.current[:__DL2_LAST_ERROR__] = error
  Thread.current[:__FIDDLE_LAST_ERROR__] = error
end

malloc(size) Show source

分配size内存字节并返回分配内存的整数内存地址。

代码语言:javascript
复制
static VALUE
rb_fiddle_malloc(VALUE self, VALUE size)
{
    void *ptr;

    ptr = (void*)ruby_xmalloc(NUM2SIZET(size));
    return PTR2NUM(ptr);
}

realloc(addr, size) Show source

将在内存位置addr分配的内存大小更改为大小字节。 返回重新分配的内存的内存地址,该地址可能与传入的地址不同。

代码语言:javascript
复制
static VALUE
rb_fiddle_realloc(VALUE self, VALUE addr, VALUE size)
{
    void *ptr = NUM2PTR(addr);

    ptr = (void*)ruby_xrealloc(ptr, NUM2SIZET(size));
    return PTR2NUM(ptr);
}

win32_last_error() Show source

返回当前正在执行的Thread的最后一个win32错误,如果没有则返回nil

代码语言:javascript
复制
# File ext/fiddle/lib/fiddle.rb, line 9
def self.win32_last_error
  Thread.current[:__FIDDLE_WIN32_LAST_ERROR__]
end

win32_last_error=(error) Show source

将当前正在执行的线程的最后一个win32错误设置为错误

代码语言:javascript
复制
# File ext/fiddle/lib/fiddle.rb, line 14
def self.win32_last_error= error
  Thread.current[:__FIDDLE_WIN32_LAST_ERROR__] = error
end

私有实例方法

dlopen(library) → Fiddle::Handle Show source

创建一个打开库的新处理程序,并返回Fiddle :: Handle的一个实例。

如果为库指定了nil,则使用Fiddle :: Handle :: DEFAULT,这等同于RTLD_DEFAULT。 参阅 man 3 dlopen。

代码语言:javascript
复制
lib = Fiddle.dlopen(nil)

缺省值取决于操作系统,并为已加载的所有库提供句柄。 例如,在大多数情况下,您可以使用它来访问libc函数或ruby函数,如rb_str_new。

有关更多信息,请参阅Fiddle :: Handle.new。

代码语言:javascript
复制
# File ext/fiddle/lib/fiddle.rb, line 45
def dlopen library
  Fiddle::Handle.new library
end

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com