LibdlModule

يوفر نموذج Libdl في جوليا مرافق متخصصة وأدنى مستوى للربط الديناميكي مع المكتبات المشتركة. بينما تدعم جوليا بشكل أساسي الربط بمكتبات مشتركة في وقت التشغيل من خلال الدالة 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، تليها مسار تحميل النظام.

حجة العلامات الاختيارية هي عملية OR بت bitwise للصفر أو أكثر من RTLD_LOCAL، RTLD_GLOBAL، RTLD_LAZY، RTLD_NOW، RTLD_NODELETE، RTLD_NOLOAD، RTLD_DEEPBIND، و RTLD_FIRST. يتم تحويل هذه إلى العلامات المقابلة لأمر dlopen في POSIX (و/أو GNU libc و/أو MacOS)، إذا كان ذلك ممكنًا، أو يتم تجاهلها إذا كانت الوظيفة المحددة غير متاحة على النظام الحالي. العلامات الافتراضية خاصة بالمنصة. على 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.

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_error إلى false، وفي هذه الحالة تعيد هذه الطريقة 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)

إغلاق المكتبة المشتركة المشار إليها بواسطة handle.

source
dlclose(::Nothing)

للنمط الشائع جداً من الاستخدام

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

نقوم بتعريف طريقة dlclose() التي تقبل معلمة من نوع Nothing، حتى لا تضطر شيفرة المستخدم إلى تغيير سلوكها في حالة عدم العثور على library_name.

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})

بالنظر إلى مكتبة handle من dlopen، أعد المسار الكامل.

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. عند النجاح، ستكون قيمة الإرجاع واحدة من الأسماء (قد تكون مسبوقة بأحد المسارات في locations). يمكن تعيين هذه السلسلة إلى global const واستخدامها كاسم المكتبة في استدعاءات ccall المستقبلية. عند الفشل، تعيد السلسلة الفارغة.

source
Base.DL_LOAD_PATHConstant
DL_LOAD_PATH

عند استدعاء dlopen، سيتم البحث عن المسارات في هذه القائمة أولاً، بالترتيب، قبل البحث في مواقع النظام عن مقبض مكتبة صالح.

source