Libdl
— ModuleJulia'daki Libdl modülü, paylaşılan kütüphanelerle dinamik bağlantı için özel ve daha düşük seviyeli olanaklar sağlar. Julia, ccall
içsel işlevi aracılığıyla çalışma zamanı paylaşılan kütüphanelerine bağlantıyı doğal olarak desteklese de, Libdl
bu yeteneği daha fazla, daha ayrıntılı kontrol sunarak genişletir. Kullanıcılara hem bellek hem de dosya sisteminde paylaşılan kütüphaneleri arama, belirli çalışma zamanı bağlayıcı seçenekleriyle manuel olarak yükleme ve kütüphane sembollerini düşük seviyeli işaretçiler olarak arama imkanı tanır.
Dynamic Linker
Base.Libc.Libdl.dlopen
— Functiondlopen(libfile::AbstractString [, flags::Integer]; throw_error:Bool = true)
Paylaşılan bir kütüphaneyi yükler ve opak bir handle döner.
Sabit dlext
tarafından verilen uzantı (.so
, .dll
veya .dylib)
libfiledizesinden çıkarılabilir, çünkü gerekirse otomatik olarak eklenir. Eğer
libfilemutlak bir yol adı değilse,
libfileiçin
DLLOADPATH` dizisindeki yollar aranır, ardından sistem yükleme yolu kontrol edilir.
İsteğe bağlı bayrak argümanı, sıfır veya daha fazla RTLD_LOCAL
, RTLD_GLOBAL
, RTLD_LAZY
, RTLD_NOW
, RTLD_NODELETE
, RTLD_NOLOAD
, RTLD_DEEPBIND
ve RTLD_FIRST
bayrağının bit düzeyinde veya işlemidir. Bunlar, mümkünse POSIX (ve/veya GNU libc ve/veya MacOS) dlopen komutunun karşılık gelen bayraklarına dönüştürülür veya belirtilen işlevsellik mevcut platformda mevcut değilse göz ardı edilir. Varsayılan bayraklar platforma özgüdür. MacOS'ta varsayılan dlopen
bayrakları RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL
iken, diğer platformlarda varsayılanlar RTLD_LAZY|RTLD_DEEPBIND|RTLD_LOCAL
'dır. Bu bayrakların önemli bir kullanımı, dinamik kütüphane yükleyicisinin kütüphane referanslarını dışa aktarılan sembollere bağladığında ve bağlı referansların işlem yerel veya küresel kapsamda olup olmadığını belirtmektir. Örneğin, RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL
, kütüphanenin sembollerinin diğer paylaşılan kütüphanelerde kullanılabilir olmasını sağlar ve paylaşılan kütüphaneler arasında bağımlılıkların olduğu durumları ele alır.
Eğer kütüphane bulunamazsa, bu yöntem bir hata fırlatır, throw_error
anahtar kelime argümanı false
olarak ayarlanmadıkça, bu durumda bu yöntem nothing
döner.
Julia 1.6'dan itibaren, bu yöntem @executable_path/
ile başlayan yolları Julia yürütülebilir dosyasının yolu ile değiştirir ve taşınabilir göreli yol yüklemelerine olanak tanır. Julia 1.5 ve öncesinde, bu yalnızca macOS'ta çalışıyordu.
Base.Libc.Libdl.dlopen_e
— Functiondlopen_e(libfile::AbstractString [, flags::Integer])
dlopen
ile benzer, ancak hataları yükseltmek yerine C_NULL
döner. Bu yöntem artık dlopen(libfile::AbstractString [, flags::Integer]; throw_error=false)
lehine kullanımdan kaldırılmıştır.
Base.Libc.Libdl.RTLD_NOW
— ConstantRTLD_DEEPBIND
RTLD_FIRST
RTLD_GLOBAL
RTLD_LAZY
RTLD_LOCAL
RTLD_NODELETE
RTLD_NOLOAD
RTLD_NOW
dlopen
için enum sabiti. Geçerliyse, platformunuzun man sayfasına bakın.
Base.Libc.Libdl.dlsym
— Functiondlsym(handle, sym; throw_error::Bool = true)
Paylaşılan bir kütüphane tutamacından bir sembol arayın, başarılı olursa çağrılabilir işlev işaretçisi döndürün.
Sembol bulunamazsa, bu yöntem bir hata fırlatır, throw_error
anahtar kelime argümanı false
olarak ayarlanmadığı sürece; bu durumda bu yöntem nothing
döndürür.
Base.Libc.Libdl.dlsym_e
— Functiondlsym_e(handle, sym)
Paylaşılan bir kütüphane tutamacından bir sembol arayın, arama başarısız olursa sessizce C_NULL
döndürün. Bu yöntem artık dlsym(handle, sym; throw_error=false)
lehine kullanımdan kaldırılmıştır.
Base.Libc.Libdl.dlclose
— Functiondlclose(handle)
Handle ile referans verilen paylaşılan kütüphaneyi kapatır.
dlclose(::Nothing)
Çok yaygın bir kullanım deseni için
try
hdl = dlopen(library_name)
... bir şey yap
finally
dlclose(hdl)
end
Kullanıcı kodunun library_name
bulunamadığında davranışını değiştirmesi gerekmemesi için, Nothing
türünde bir parametre kabul eden bir dlclose()
yöntemi tanımlıyoruz.
Base.Libc.Libdl.dlext
— Constantdlext
Mevcut platformda dinamik kütüphaneler için dosya uzantısı (örn. dll, dylib, so).
Base.Libc.Libdl.dllist
— Functiondllist()
Şu anda yüklü olan dinamik kütüphanelerin yollarını Vector{String}
içinde döndürür.
Base.Libc.Libdl.dlpath
— Functiondlpath(handle::Ptr{Cvoid})
dlopen
ile alınan bir kütüphane handle
'dan tam yolu döndürür.
dlpath(libname::Union{AbstractString, Symbol})
libname
kütüphanesinin tam yolunu alır.
Örnekler
julia> dlpath("libjulia")
Base.Libc.Libdl.find_library
— Functionfind_library(names [, locations])
names
listesindeki ilk kütüphaneyi, locations
listesindeki yolları, DL_LOAD_PATH
veya sistem kütüphane yollarını (bu sırayla) kullanarak arar ve başarılı bir şekilde dlopen'lanabilir. Başarılı olursa, dönen değer, isimlerden biri (potansiyel olarak locations'daki yolların biriyle ön eklenmiş) olacaktır. Bu dize, gelecekteki ccall
'lerde kütüphane adı olarak kullanılmak üzere bir global const
'a atanabilir. Başarısız olursa, boş dize döner.
Base.DL_LOAD_PATH
— ConstantDL_LOAD_PATH
dlopen
çağrıldığında, bu listedeki yollar öncelikle, sırayla, geçerli bir kütüphane tutucu için sistem konumlarını aramadan önce aranacaktır.