Class: FFI::DynamicLibrary
| Relationships & Source Files | |
| Namespace Children | |
| Classes: | |
| Inherits: | Object | 
| Defined in: | ext/ffi_c/DynamicLibrary.c, lib/ffi/dynamic_library.rb | 
Constant Summary
- 
    SEARCH_PATH =
    
 # File 'lib/ffi/dynamic_library.rb', line 33[] 
- 
    SEARCH_PATH_MESSAGE =
    
 # File 'lib/ffi/dynamic_library.rb', line 67"Searched in <system library path>#{ SEARCH_PATH.map{|a| ', ' + a}.join }".freeze 
Class Method Summary
- #last_error (also: #last_error)
- .new(libname, libflags) constructor
- .open(libname, libflags)
- .load_library(name, flags) private
- .try_load(libname, flags, errors) private
Instance Attribute Summary
- #name readonly
Instance Method Summary
- 
    
      #find_function(name)  
    
    Alias for #find_symbol. 
- #find_symbol(name) (also: #find_function, #find_variable)
- 
    
      #find_variable(name)  
    
    Alias for #find_symbol. 
- 
    
      #last_error  
    
    Alias for .last_error. 
Constructor Details
    
      .new(libname, libflags)  
      .new(DynamicLibrary)  
    
  
# File 'ext/ffi_c/DynamicLibrary.c', line 136
static VALUE
library_initialize(VALUE self, VALUE libname, VALUE libflags)
{
    Library* library;
    int flags;
    Check_Type(libflags, T_FIXNUM);
    TypedData_Get_Struct(self, Library, &rbffi_library_data_type, library);
    flags = libflags != Qnil ? NUM2UINT(libflags) : 0;
    library->handle = dl_open(libname != Qnil ? StringValueCStr(libname) : NULL, flags);
    if (library->handle == NULL) {
        char errmsg[1024];
        dl_error(errmsg, sizeof(errmsg));
        rb_raise(rb_eLoadError, "Could not open library '%s': %s",
                libname != Qnil ? StringValueCStr(libname) : "[current process]",
                errmsg);
    }
#ifdef __CYGWIN__
    // On Cygwin 1.7.17 "dlsym(dlopen(0,0), 'getpid')" fails. (dlerror: "No such process")
    // As a workaround we can use "dlsym(RTLD_DEFAULT, 'getpid')" instead.
    // Since 0 == RTLD_DEFAULT we won't call dl_close later.
    if (libname == Qnil) {
        dl_close(library->handle);
        library->handle = RTLD_DEFAULT;
    }
#endif
    rb_iv_set(self, "@name", libname != Qnil ? rb_str_new_frozen(libname) : rb_str_new2("[current process]"));
    rb_obj_freeze(self);
    return self;
}
  Class Method Details
#last_error Also known as: #last_error
# File 'ext/ffi_c/DynamicLibrary.c', line 187
static VALUE
library_dlerror(VALUE self)
{
    char errmsg[1024];
    dl_error(errmsg, sizeof(errmsg));
    return rb_str_new2(errmsg);
}
  .load_library(name, flags) (private)
[ GitHub ]# File 'lib/ffi/dynamic_library.rb', line 69
def self.load_library(name, flags) if name == FFI::CURRENT_PROCESS FFI::DynamicLibrary.open(nil, RTLD_LAZY | RTLD_LOCAL) else flags ||= RTLD_LAZY | RTLD_LOCAL libnames = (name.is_a?(::Array) ? name : [name]) libnames = libnames.map(&:to_s).map { |n| [n, FFI.map_library_name(n)].uniq }.flatten.compact errors = [] libnames.each do |libname| lib = try_load(libname, flags, errors) return lib if lib unless libname.start_with?("/") SEARCH_PATH.each do |prefix| path = "#{prefix}/#{libname}" if File.exist?(path) lib = try_load(path, flags, errors) return lib if lib end end end end raise LoadError, [*errors, SEARCH_PATH_MESSAGE].join(".\n") end end
    
      .open(libname, libflags)  
      .a(library)  
    
  
# File 'ext/ffi_c/DynamicLibrary.c', line 122
static VALUE
library_open(VALUE klass, VALUE libname, VALUE libflags)
{
    return library_initialize(library_allocate(klass), libname, libflags);
}
  .try_load(libname, flags, errors) (private)
[ GitHub ]# File 'lib/ffi/dynamic_library.rb', line 99
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. =~ /(([^ \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
Instance Attribute Details
#name (readonly)
[ GitHub ]Instance Method Details
    
      #find_symbol(name)  
      #find_function(name)  
    
  
Alias for #find_symbol.
#find_symbol(name) Also known as: #find_function, #find_variable
# File 'ext/ffi_c/DynamicLibrary.c', line 170
static VALUE
library_dlsym(VALUE self, VALUE name)
{
    Library* library;
    void* address = NULL;
    Check_Type(name, T_STRING);
    TypedData_Get_Struct(self, Library, &rbffi_library_data_type, library);
    address = dl_sym(library->handle, StringValueCStr(name));
    return address != NULL ? symbol_new(self, address, name) : Qnil;
}
  
    
      #find_symbol(name)  
      #find_variable(name)  
    
  
Alias for #find_symbol.
    
      #last_error  
      #last_error  
    
  
Alias for .last_error.