Maintenance of Ruby 2.0.0 ended on February 24, 2016. Read more
A bridge to the dlopen() or dynamic library linker function.
bash $> cat > sum.c <<EOF
double sum(double *arry, int len)
{
double ret = 0;
int i;
for(i = 0; i < len; i++){
ret = ret + arry[i];
}
return ret;
}
double split(double num)
{
double ret = 0;
ret = num / 2;
return ret;
}
EOF
bash $> gcc -o libsum.so -shared sum.c
bash $> cat > sum.rb <<EOF
require 'dl'
require 'dl/import'
module LibSum
extend DL::Importer
dlload './libsum.so'
extern 'double sum(double*, int)'
extern 'double split(double)'
end
a = [2.0, 3.0, 4.0]
sum = LibSum.sum(a.pack("d*"), a.count)
p LibSum.split(sum)
EOF
bash $> ruby sum.rb
4.5
WIN! :-)
The alignment size of a char
The alignment size of a double
The alignment size of a float
The alignment size of an int
The alignment size of a intptr_t
The alignment size of a long
The alignment size of a long long
The alignment size of a ptrdiff_t
The alignment size of a short
The alignment size of a size_t
The alignment size of a ssize_t
The alignment size of a uintptr_t
The alignment size of a void*
Platform built against (i.e. “x86_64-linux”, etc.)
See also RUBY_PLATFORM
Ruby Version built. (i.e. “1.9.3”)
See also RUBY_VERSION
Dynamic linker stack size
Maximum number of callbacks
rtld DL::Handle flag.
The symbols defined by this library will be made available for symbol resolution of subsequently loaded libraries.
rtld DL::Handle flag.
Perform lazy binding. Only resolve symbols as the code that references them is executed. If the symbol is never referenced, then it is never resolved. (Lazy binding is only performed for function references; references to variables are always immediately bound when the library is loaded.)
rtld DL::Handle flag.
If this value is specified or the environment variable LD_BIND_NOW is set to a nonempty string, all undefined symbols in the library are resolved before dlopen() returns. If this cannot be done an error is returned.
Address of the ruby_xfree() function
size of a char
size of a double
size of a float
size of an int
size of a intptr_t
size of a long
size of a long long
size of a ptrdiff_t
size of a short
size of a size_t
size of a ssize_t
size of a uintptr_t
size of a void*
DL::CFunc type - char
DL::CFunc type - double
DL::CFunc type - float
DL::CFunc type - int
DL::CFunc type - intptr_t
DL::CFunc type - long
DL::CFunc type - long long
DL::CFunc type - ptrdiff_t
DL::CFunc type - short
DL::CFunc type - size_t
DL::CFunc type - ssize_t
DL::CFunc type - uintptr_t
DL::CFunc type - void
DL::CFunc type - void*
An interface to the dynamic linking loader
This is a shortcut to DL::Handle.new and takes the same arguments.
Example:
libc_so = "/lib64/libc.so.6" => "/lib64/libc.so.6" libc = DL.dlopen(libc_so) => #<DL::Handle:0x00000000e05b00>
VALUE
rb_dl_dlopen(int argc, VALUE argv[], VALUE self)
{
return rb_class_new_instance(argc, argv, rb_cDLHandle);
}
Returns the hexadecimal representation of a memory pointer address
addr
Example:
lib = DL.dlopen('/lib64/libc-2.15.so')
=> #<DL::Handle:0x00000001342460>
lib['strcpy'].to_s(16)
=> "7f59de6dd240"
DL.dlunwrap(DL.dlwrap(lib['strcpy'].to_s(16)))
=> "7f59de6dd240"
VALUE
rb_dl_ptr2value(VALUE self, VALUE addr)
{
rb_secure(4);
return (VALUE)NUM2PTR(addr);
}
Returns a memory pointer of a function's hexadecimal address location
val
Example:
lib = DL.dlopen('/lib64/libc-2.15.so')
=> #<DL::Handle:0x00000001342460>
DL.dlwrap(lib['strcpy'].to_s(16))
=> 25522520
VALUE
rb_dl_value2ptr(VALUE self, VALUE val)
{
return PTR2NUM((void*)val);
}
Free the memory at address addr
VALUE
rb_dl_free(VALUE self, VALUE addr)
{
void *ptr = NUM2PTR(addr);
rb_secure(4);
ruby_xfree(ptr);
return Qnil;
}
Allocate size bytes of memory and return the integer memory
address for the allocated memory.
VALUE
rb_dl_malloc(VALUE self, VALUE size)
{
void *ptr;
rb_secure(4);
ptr = (void*)ruby_xmalloc(NUM2INT(size));
return PTR2NUM(ptr);
}
Change the size of the memory allocated at the memory location
addr to size bytes. Returns the memory address
of the reallocated memory, which may be different than the address passed
in.
VALUE
rb_dl_realloc(VALUE self, VALUE addr, VALUE size)
{
void *ptr = NUM2PTR(addr);
rb_secure(4);
ptr = (void*)ruby_xrealloc(ptr, NUM2INT(size));
return PTR2NUM(ptr);
}
# File dl/lib/dl/callback.rb, line 70
def remove_callback_internal(proc_entry, addr_entry, addr, ctype = nil)
if DL.fiddle?
addr = addr.to_i
return false unless proc_entry.key?(addr)
proc_entry.delete(addr)
true
else
index = nil
if( ctype )
addr_entry[ctype].each_with_index{|xaddr, idx|
if( xaddr == addr )
index = idx
end
}
else
addr_entry.each{|ty,entry|
entry.each_with_index{|xaddr, idx|
if( xaddr == addr )
index = idx
end
}
}
end
if( index and proc_entry[ctype][index] )
proc_entry[ctype][index] = nil
return true
else
return false
end
end
end
# File dl/lib/dl/callback.rb, line 102
def remove_cdecl_callback(addr, ctype = nil)
remove_callback_internal(CdeclCallbackProcs, CdeclCallbackAddrs, addr, ctype)
end
# File dl/lib/dl/callback.rb, line 106
def remove_stdcall_callback(addr, ctype = nil)
remove_callback_internal(StdcallCallbackProcs, StdcallCallbackAddrs, addr, ctype)
end
# File dl/lib/dl/callback.rb, line 30
def set_callback_internal(proc_entry, addr_entry, argc, ty, abi = nil, &cbp)
if( argc < 0 )
raise(ArgumentError, "arity should not be less than 0.")
end
addr = nil
if DL.fiddle?
abi ||= Fiddle::Function::DEFAULT
closure = Fiddle::Closure::BlockCaller.new(ty, [TYPE_VOIDP] * argc, abi, &cbp)
proc_entry[closure.to_i] = closure
addr = closure.to_i
else
SEM.synchronize{
ary = proc_entry[ty]
(0...MAX_CALLBACK).each{|n|
idx = (n * DLSTACK_SIZE) + argc
if( ary[idx].nil? )
ary[idx] = cbp
addr = addr_entry[ty][idx]
break
end
}
}
end
addr
end
# File dl/lib/dl/callback.rb, line 58
def set_cdecl_callback(ty, argc, &cbp)
set_callback_internal(CdeclCallbackProcs, CdeclCallbackAddrs, argc, ty, &cbp)
end
# File dl/lib/dl/callback.rb, line 62
def set_stdcall_callback(ty, argc, &cbp)
if DL.fiddle?
set_callback_internal(StdcallCallbackProcs, StdcallCallbackAddrs, argc, ty, Fiddle::Function::STDCALL, &cbp)
else
set_callback_internal(StdcallCallbackProcs, StdcallCallbackAddrs, argc, ty, &cbp)
end
end