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
を返します。
Julia 1.6 以降、このメソッドは @executable_path/
で始まるパスを Julia 実行可能ファイルへのパスに置き換え、再配置可能な相対パスのロードを可能にします。Julia 1.5 およびそれ以前では、これは macOS でのみ機能しました。
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_NOW
dlopen
のための列挙定数。該当する場合は、プラットフォームのマニュアルページを参照してください。
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(handle)
ハンドルによって参照される共有ライブラリを閉じます。
dlclose(::Nothing)
非常に一般的な使用パターンのために
try
hdl = dlopen(library_name)
... do something
finally
dlclose(hdl)
end
library_name
が見つからなかった場合にユーザーコードがその動作を変更する必要がないように、Nothing
型のパラメータを受け取るdlclose()
メソッドを定義します。
Base.Libc.Libdl.dlext
— Constantdlext
現在のプラットフォームでの動的ライブラリのファイル拡張子(例:dll、dylib、so)。
Base.Libc.Libdl.dllist
— Functiondllist()
現在ロードされている動的ライブラリのパスを Vector{String}
で返します。
Base.Libc.Libdl.dlpath
— Functiondlpath(handle::Ptr{Cvoid})
dlopen
からのライブラリhandle
を指定して、フルパスを返します。
dlpath(libname::Union{AbstractString, Symbol})
ライブラリ libname
のフルパスを取得します。
例
julia> dlpath("libjulia")
Base.Libc.Libdl.find_library
— Functionfind_library(names [, locations])
names
の中の最初のライブラリを、locations
リスト内のパス、DL_LOAD_PATH
、またはシステムライブラリパス(その順序で)で検索し、成功裏にdlopenできるものを探します。成功した場合、返り値はnames
のいずれか(潜在的にlocations
内のパスのいずれかでプレフィックスされる可能性があります)になります。この文字列はglobal const
に割り当てることができ、将来のccall
でライブラリ名として使用できます。失敗した場合、空の文字列を返します。
Base.DL_LOAD_PATH
— ConstantDL_LOAD_PATH
dlopen
を呼び出すとき、このリスト内のパスが最初に順番に検索され、その後にシステムの場所で有効なライブラリハンドルが検索されます。