Libdl — ModuleJuliaのLibdlモジュールは、共有ライブラリとの動的リンクのための専門的で低レベルの機能を提供します。Juliaは本質的にccall内蔵関数を通じてランタイム共有ライブラリへのリンクをサポートしていますが、Libdlはこの機能を拡張し、追加のより詳細な制御を提供します。これにより、ユーザーはメモリとファイルシステムの両方で共有ライブラリを検索し、特定のランタイムリンカオプションを使用して手動でロードし、ライブラリシンボルを低レベルのポインタとして検索することができます。
Dynamic Linker
Base.Libc.Libdl.dlopen — Functiondlopen(libfile::AbstractString [, flags::Integer]; throw_error:Bool = true)共有ライブラリをロードし、不透明なハンドルを返します。
定数 dlext によって与えられる拡張子(.so、.dll、または .dylib)は、必要に応じて libfile 文字列から省略できます。libfile が絶対パス名でない場合、配列 DL_LOAD_PATH 内のパスが libfile を検索し、その後にシステムのロードパスが続きます。
オプションのフラグ引数は、RTLD_LOCAL、RTLD_GLOBAL、RTLD_LAZY、RTLD_NOW、RTLD_NODELETE、RTLD_NOLOAD、RTLD_DEEPBIND、および RTLD_FIRST のゼロまたはそれ以上のビット単位の論理和です。これらは、可能であれば POSIX(および/または GNU libc および/または MacOS)の dlopen コマンドの対応するフラグに変換されます。指定された機能が現在のプラットフォームで利用できない場合は無視されます。デフォルトのフラグはプラットフォームに依存します。MacOS ではデフォルトの dlopen フラグは RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL ですが、他のプラットフォームではデフォルトは RTLD_LAZY|RTLD_DEEPBIND|RTLD_LOCAL です。これらのフラグの重要な使用法は、動的ライブラリローダーがライブラリ参照をエクスポートされたシンボルにバインドする際のデフォルト以外の動作を指定し、バインドされた参照がプロセスローカルまたはグローバルスコープに配置されるかどうかを指定することです。たとえば、RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL は、ライブラリのシンボルが他の共有ライブラリで使用できるようにし、共有ライブラリ間の依存関係がある状況に対処します。
ライブラリが見つからない場合、このメソッドはエラーをスローします。ただし、キーワード引数 throw_error が false に設定されている場合、このメソッドは nothing を返します。
Base.Libc.Libdl.dlopen_e — Functiondlopen_e(libfile::AbstractString [, flags::Integer])dlopenと似ていますが、エラーを発生させる代わりにC_NULLを返します。このメソッドは、dlopen(libfile::AbstractString [, flags::Integer]; throw_error=false)の代わりに非推奨となりました。
Base.Libc.Libdl.RTLD_NOW — ConstantRTLD_DEEPBIND
RTLD_FIRST
RTLD_GLOBAL
RTLD_LAZY
RTLD_LOCAL
RTLD_NODELETE
RTLD_NOLOAD
RTLD_NOWdlopen の列挙定数。該当する場合は、プラットフォームのマニュアルページを参照してください。
Base.Libc.Libdl.dlsym — Functiondlsym(handle, sym; throw_error::Bool = true)共有ライブラリハンドルからシンボルを検索し、成功した場合は呼び出し可能な関数ポインタを返します。
シンボルが見つからない場合、このメソッドはエラーをスローしますが、キーワード引数 throw_error が false に設定されている場合は、このメソッドは nothing を返します。
Base.Libc.Libdl.dlsym_e — Functiondlsym_e(handle, sym)共有ライブラリハンドルからシンボルを検索し、検索失敗時には静かに C_NULL を返します。このメソッドは現在、dlsym(handle, sym; throw_error=false) に代わって非推奨となっています。
Base.Libc.Libdl.dlclose — Functiondlclose(::Nothing)非常に一般的な使用パターンである
try
hdl = dlopen(library_name)
... do something
finally
dlclose(hdl)
endユーザーコードが library_name が見つからなかった場合の動作を変更する必要がないように、Nothing 型のパラメータを受け取る dlclose() メソッドを定義します。
dlclose(handle)ハンドルによって参照される共有ライブラリを閉じます。
Base.Libc.Libdl.dlext — Constantdlext現在のプラットフォームでの動的ライブラリのファイル拡張子(例:dll、dylib、so)。
Base.Libc.Libdl.dllist — Functiondllist()現在ロードされている動的ライブラリのパスを Vector{String} で返します。
Base.Libc.Libdl.dlpath — Functiondlpath(libname::Union{AbstractString, Symbol})ライブラリ libname のフルパスを取得します。
例
julia> dlpath("libjulia")dlpath(handle::Ptr{Cvoid})dlopenからのライブラリhandleを与えると、フルパスを返します。
Base.Libc.Libdl.find_library — Functionfind_library(names [, locations])namesの中で最初に見つかったライブラリを、locationsリスト内のパス、DL_LOAD_PATH、またはシステムライブラリパス(その順番で)から検索します。成功した場合、返り値は名前のいずれか(潜在的にlocations内のパスのいずれかでプレフィックスされる可能性があります)になります。この文字列はglobal constに割り当てることができ、将来のccallでライブラリ名として使用できます。失敗した場合、空の文字列を返します。
Base.DL_LOAD_PATH — ConstantDL_LOAD_PATHdlopenを呼び出すとき、このリスト内のパスが最初に順番に検索され、その後にシステムの場所で有効なライブラリハンドルが検索されます。