module DL
クラスの継承リスト: DL
要約
UNIX の dlopen(3) や Windows の LoadLibrary() などのダイナミックリンカへの低レベルな インターフェースを提供するモジュールです。
モジュール DL は 3 つのクラスから成っています。
- DL::Symbol
-
ダイナミックライブラリの関数のラッパークラスです。
- DL::PtrData
-
C のポインタのようなメモリブロックを表すクラスです。
- DL::Handle
-
オープンされたダイナミックライブラリを表すクラスです。
Type specifiers
プロトタイプは以下の型修飾子から成ります。プロトタイプの最初の要素は戻り値 の型を意味します。残りの要素は各引数の型を意味します。
- C
-
文字 (char)
- c
-
文字を指すポインタ (char *)
- H
-
short 整数 (short)
- h
-
short 整数を指すポインタ (short *)
- I
-
整数 (char, short, int)
- i
-
整数を指すポインタ (char *, short *, int *)
- L
-
long int
- l
-
long int へのポインタ (long *)
- F
-
実数 (float)
- f
-
実数へのポインタ (float *)
- D
-
実数 (double)
- d
-
実数へのポインタ(double *)
- S
-
不変 (immutable) の文字列 (const char *)
- s
-
変更可能(mutable)な文字列 (char *)
- A
-
配列 (const type[])
- a
-
変更可能 (mutable) な配列 (type[])
- P
-
ポインタ (void *)
- p
-
変更可能 (mutable) なポインタ (void *)
- 0
-
void 関数 (これはプロトタイプの最初の文字でなければならない)
cbtype は型修飾子 0, C, I, H, L, F, D, S そして P から成ります。 例えば,
DL.callback('IPP'){|ptr1,ptr2| str1 = ptr1.ptr.to_s str2 = ptr2.ptr.to_s str1 <=> str2 }
Ruby のオブジェクトから C の型への変換
DL.#callback や DL::Handle#sym で指定した 型指定子に従って Ruby のオブジェクトと C の型は相互に変換されます。
特異メソッド
last_error
last_error=
-
[TODO]
win32_last_error
win32_last_error=
-
[TODO]
モジュール関数
callback(type) -> DL::Symbol
define_callback(type) -> DL::Symbol
-
[TODO]
Cレベルのコールバック関数を定義し、その関数(へのポインタ)を保持した DL::Symbol を返します。
- [PARAM] type:
- コールバック関数の型指定子を与えます。
- [EXCEPTION] DL::DLError:
- 定義できるコールバック関数の数には制限があります。それを越えると、DL::DLError が発生します。
require 'dl/import' strlast = DL.callback('IS'){|s| s[-1] } module M extend DL::Importable dlload "./libtest.so" extern "int call(void *, const char*)" end p LIBC.call(strlast, "abcd").chr #=> "d"
/* libtest.so */ int call(int (*cb)(const char*), const char* s){ return (*cb)(s); }
dlopen(lib) -> DL::Handle
dlopen(lib) {|handle| ... } -> DL::Handle
-
ダイナミックライブラリ lib をロードし、 DL::Handle として返します。
ブロックが与えられている場合は、DL::Handle 引数として 与えられたブロックを実行します。DL::Handle を返します。
DL::Handle.new(lib) と等価です。
- [PARAM] lib:
- ロードしたいライブラリを文字列で与えます。
- [EXCEPTION] RuntimeError:
- dlopen(3) に失敗した時に発生します。
malloc(size) -> DL::PtrData
-
size バイトのメモリ領域を確保し、 その領域を指す DL::PtrData オブジェクトを返します。
この返り値には、DL::FREE が free 関数としてセットされています。
- [PARAM] size:
- 必要なメモリ領域のサイズを指定します。
remove_callback(sym) -> nil
-
コールバック関数 sym を DL::FuncTable から削除します。 以後 sym.call を呼ぶことができなくなります。
- [PARAM] sym:
- テーブルから削除したい DL::Symbol オブジェクトを与えます。
sizeof(type) -> Integer
-
型のサイズを返します。
sizeof("C") + sizeof("L") は、sizeof("CL") と等価ではありません。 後者は構造体 struct foo { char c; long l; } の 十分なサイズを返すと推定されますが、 そのサイズは C の sizeof(foo) と同じではないかもしれません。 つまり、sizeof メソッドは独自にアラインメントを考慮してサイズを決定 しますが、 C 言語のそれとは異なるかもしれません。
sizeof("L3") のように型の後に数字を付けることもできます。 指定できる型については DL を参照してください。
- [PARAM] type:
- 型指定子を文字列で与えます。
- [EXCEPTION] DL::DLTypeError:
- 定められた文字以外を型指定子として与えると発生します。
strdup(str) -> DL::PtrData
-
文字列 str を複製し、その新しい文字列へのポインタ DL::PtrData オブジェクトを返します。
この返り値には、DL::FREE が free 関数としてセットされています。
- [PARAM] str:
- 文字列を与えます。
定数
ALIGN_DOUBLE
-
[TODO]
ALIGN_FLOAT
-
[TODO]
ALIGN_INT
-
[TODO]
ALIGN_LONG
-
[TODO]
ALIGN_SHORT
-
[TODO]
ALIGN_VOIDP
-
[TODO]
DLSTACK
-
[TODO]
FREE
-
[TODO]
free(3) を表す DL::Symbol です。 この定数に新たに DL::Symbol を代入しても、DL::PtrData にデフォルトでセットされる free 関数が変わることはありません。
FuncTable
-
[TODO]
MAX_ARG
-
[TODO]
RTLD_GLOBAL
-
[TODO]
RTLD_LAZY
-
[TODO]
RTLD_NOW
-
[TODO]