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
중 0개 이상의 비트 OR입니다. 이러한 플래그는 가능할 경우 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할 수 있는 첫 번째 라이브러리를 검색합니다. 성공 시, 반환 값은 이름 중 하나가 될 것이며(잠재적으로 locations의 경로 중 하나로 접두사가 붙을 수 있음) 이 문자열은 global const
에 할당되어 향후 ccall
에서 라이브러리 이름으로 사용될 수 있습니다. 실패 시, 빈 문자열을 반환합니다.
Base.DL_LOAD_PATH
— ConstantDL_LOAD_PATH
dlopen
를 호출할 때, 이 목록의 경로가 먼저 순서대로 검색되며, 유효한 라이브러리 핸들을 찾기 위해 시스템 위치를 검색하기 전에 검색됩니다.