diff options
author | Lamont Granquist <lamont@scriptkiddie.org> | 2015-04-06 12:22:11 -0700 |
---|---|---|
committer | Lamont Granquist <lamont@scriptkiddie.org> | 2015-04-06 12:24:04 -0700 |
commit | 9a536029c699ee501d9278577a300a5ef3d147dd (patch) | |
tree | 7e3d63890d70f72a048a64cd6f4e52c9075d99fa /ext/ffi_yajl | |
parent | 10c7da3b6002a59e21c9c8ee202f6f713c3959f9 (diff) | |
download | ffi-yajl-9a536029c699ee501d9278577a300a5ef3d147dd.tar.gz |
add native dlopen extension code
This will get dlopen in a consistent place on all the platforms
which need it.
Diffstat (limited to 'ext/ffi_yajl')
-rw-r--r-- | ext/ffi_yajl/ext/dlopen/dlopen.c | 38 | ||||
-rw-r--r-- | ext/ffi_yajl/ext/dlopen/extconf.rb | 15 |
2 files changed, 53 insertions, 0 deletions
diff --git a/ext/ffi_yajl/ext/dlopen/dlopen.c b/ext/ffi_yajl/ext/dlopen/dlopen.c new file mode 100644 index 0000000..7330763 --- /dev/null +++ b/ext/ffi_yajl/ext/dlopen/dlopen.c @@ -0,0 +1,38 @@ +#include <ruby.h> + +#if defined(HAVE_DLFCN_H) +# include <dlfcn.h> +#ifndef RTLD_LAZY +#define RTLD_LAZY 0 +#endif +#ifndef RTLD_GLOBAL +#define RTLD_GLOBAL 0 +#endif +#ifndef RTLD_NOW +#define RTLD_NOW 0 +#endif +#else +# if defined(_WIN32) +# include <windows.h> +# define dlopen(name,flag) ((void*)LoadLibrary(name)) +# define dlerror() strerror(rb_w32_map_errno(GetLastError())) +# define dlsym(handle,name) ((void*)GetProcAddress((handle),(name))) +# define RTLD_LAZY -1 +# define RTLD_NOW -1 +# define RTLD_GLOBAL -1 +# endif +#endif + +static VALUE mFFI_Yajl, mDlopen, mExt; + +static VALUE mDlopen_dlopen(VALUE self, VALUE file) { + dlopen(RSTRING_PTR(file), RTLD_NOW|RTLD_GLOBAL); + return Qnil; +} + +void Init_dlopen() { + mFFI_Yajl = rb_define_module("FFI_Yajl"); + mExt = rb_define_module_under(mFFI_Yajl, "Ext"); + mDlopen = rb_define_module_under(mExt, "Dlopen"); + rb_define_method(mDlopen, "dlopen", mDlopen_dlopen, 1); +} diff --git a/ext/ffi_yajl/ext/dlopen/extconf.rb b/ext/ffi_yajl/ext/dlopen/extconf.rb new file mode 100644 index 0000000..7e18469 --- /dev/null +++ b/ext/ffi_yajl/ext/dlopen/extconf.rb @@ -0,0 +1,15 @@ +require 'mkmf' +require 'rubygems' + +RbConfig::MAKEFILE_CONFIG['CC'] = ENV['CC'] if ENV['CC'] + +puts $CFLAGS +puts $LDFLAGS + +have_header("dlfcn.h") + +have_library("dl", "dlopen") + +dir_config 'dlopen' + +create_makefile 'ffi_yajl/ext/dlopen' |