LibdlModule

JuliaのLibdlモジュールは、共有ライブラリとの動的リンクのための専門的で低レベルの機能を提供します。Juliaは本質的にccall内部関数を通じてランタイム共有ライブラリへのリンクをサポートしていますが、Libdlはこの機能を拡張し、追加のより詳細な制御を提供します。これにより、ユーザーはメモリとファイルシステムの両方で共有ライブラリを検索し、特定のランタイムリンカオプションを使用して手動でロードし、ライブラリシンボルを低レベルのポインタとして検索することができます。

source

Dynamic Linker

Base.Libc.Libdl.dlopenFunction
dlopen(libfile::AbstractString [, flags::Integer]; throw_error:Bool = true)

共有ライブラリをロードし、不透明なハンドルを返します。

定数 dlext.so.dll、または .dylib)によって与えられる拡張子は、必要に応じて自動的に追加されるため、libfile 文字列から省略できます。libfile が絶対パス名でない場合、配列 DL_LOAD_PATH 内のパスが libfile を検索し、その後にシステムのロードパスが続きます。

オプションのフラグ引数は、RTLD_LOCALRTLD_GLOBALRTLD_LAZYRTLD_NOWRTLD_NODELETERTLD_NOLOADRTLD_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_errorfalse に設定されている場合、このメソッドは nothing を返します。

Note

Julia 1.6 以降、このメソッドは @executable_path/ で始まるパスを Julia 実行可能ファイルへのパスに置き換え、再配置可能な相対パスのロードを可能にします。Julia 1.5 およびそれ以前では、これは macOS でのみ機能しました。

source
Base.Libc.Libdl.dlopen_eFunction
dlopen_e(libfile::AbstractString [, flags::Integer])

dlopenと似ていますが、エラーを発生させる代わりにC_NULLを返します。このメソッドは、dlopen(libfile::AbstractString [, flags::Integer]; throw_error=false)の代わりに非推奨となりました。

source
Base.Libc.Libdl.RTLD_NOWConstant
RTLD_DEEPBIND
RTLD_FIRST
RTLD_GLOBAL
RTLD_LAZY
RTLD_LOCAL
RTLD_NODELETE
RTLD_NOLOAD
RTLD_NOW

dlopen のための列挙定数。該当する場合は、プラットフォームのマニュアルページを参照してください。

source
Base.Libc.Libdl.dlsymFunction
dlsym(handle, sym; throw_error::Bool = true)

共有ライブラリハンドルからシンボルを検索し、成功した場合は呼び出し可能な関数ポインタを返します。

シンボルが見つからない場合、このメソッドはエラーをスローしますが、キーワード引数 throw_errorfalse に設定されている場合は、このメソッドは nothing を返します。

source
Base.Libc.Libdl.dlsym_eFunction
dlsym_e(handle, sym)

共有ライブラリハンドルからシンボルを検索し、検索失敗時には静かに C_NULL を返します。このメソッドは現在、dlsym(handle, sym; throw_error=false) の代わりに非推奨となっています。

source
Base.Libc.Libdl.dlcloseFunction
dlclose(handle)

ハンドルによって参照される共有ライブラリを閉じます。

source
dlclose(::Nothing)

非常に一般的な使用パターンのために

try
    hdl = dlopen(library_name)
    ... do something
finally
    dlclose(hdl)
end

library_nameが見つからなかった場合にユーザーコードがその動作を変更する必要がないように、Nothing型のパラメータを受け取るdlclose()メソッドを定義します。

source
Base.Libc.Libdl.dlextConstant
dlext

現在のプラットフォームでの動的ライブラリのファイル拡張子(例:dll、dylib、so)。

source
Base.Libc.Libdl.dllistFunction
dllist()

現在ロードされている動的ライブラリのパスを Vector{String} で返します。

source
Base.Libc.Libdl.dlpathFunction
dlpath(handle::Ptr{Cvoid})

dlopenからのライブラリhandleを指定して、フルパスを返します。

source
dlpath(libname::Union{AbstractString, Symbol})

ライブラリ libname のフルパスを取得します。

julia> dlpath("libjulia")
source
Base.Libc.Libdl.find_libraryFunction
find_library(names [, locations])

namesの中の最初のライブラリを、locationsリスト内のパス、DL_LOAD_PATH、またはシステムライブラリパス(その順序で)で検索し、成功裏にdlopenできるものを探します。成功した場合、返り値はnamesのいずれか(潜在的にlocations内のパスのいずれかでプレフィックスされる可能性があります)になります。この文字列はglobal constに割り当てることができ、将来のccallでライブラリ名として使用できます。失敗した場合、空の文字列を返します。

source
Base.DL_LOAD_PATHConstant
DL_LOAD_PATH

dlopenを呼び出すとき、このリスト内のパスが最初に順番に検索され、その後にシステムの場所で有効なライブラリハンドルが検索されます。

source