2023. 1. 26. 11:36ㆍProgramming/JAVA, C++, Go, Rust
- 목차
IRIX는 run-time linker library interface를 제공합니다. 이로서 프로그램을 동적으로 load 및 unload 할 수 있습니다. 이 interface가 libdl이라고 불립니다. libdl은 4개이 함수를 인터페이스로서 제공합니다.
function | desc. |
---|---|
dlopen() | DSO를 로드 |
dlsym() | 적재된 DSO 내에서 symbol을 찾음 |
dlclose() | DSO를 해제 |
dlerror() | 발생한 error 확인 |
dlopen
dlopen ex.
include <dlfcn.h>
int main() {
void *dlhandle = dlopen("mylib.so", RTL_LAZY);
if (NULL == dlhandle) {
printf("%s\r\n", dlerror());
}
}
dlopen의 첫 번째 인자는 DSO의 path 입니다. 절대 path 혹은 상대 path를 지정할 수 있습니다.
run-time linker가 여러 위치에서 해당 DSO의 존재 유무를 찾은 뒤 찾게될 경우 open을 수행합니다.
DSO 내에 unresolved reference가 존재한다면, run-time linker는 수행 시 (on-demand) 이러한 reference들을 resolve(찾아내어 해결) 합니다.
dlsym()은 DSO 내 symbol에 access하기 위해 사용합니다. 해당 symbol이 executable에서 사용되던 안되던 상관없이 찾습니다.
DSO가 process의 주소공간으로 적재될때, 주소를 알지 못하는 심볼들을 참조하는 것을 포함할 수 있습니다. 이런 참조들은 symbol에 access 하기 전에 반드시 relocate 되어야 합니다. dlopen의 두 번째 인자가 이런 relocation의 수행을 관장합니다.
두 가지 방식을 제공합니다.
1) RTLD_LAZY
object 적재 시 data symbol에 대한 참조들만 relocate 됩니다. 함수에 대한 참조는 해당 함수가 최초 호출 될 때까지 relocate 되지 않습니다. 이는 process가 shared object가 제공하는 모든 함수들에 access 하지 않는 한 보다 나은 성능을 제공합니다.
2) RTLD_NOW
object가 최초 적재될 시 모든 relocation이 수행됩니다. 사용되지 않는 함수까지 모두 relocation 하는 부분은 낭비일 수 있습니다. 그러나 실행 직후 모든 참조하는 심볼들에 access 할 수 있다는 것을 알 수 있다는 점에서 유용합니다.
dlsym
프로그램이 직접 참조하지 않는 symbol에 access 하기 위해서 사용합니다. '
dlclose
dlopen 호출에 이해 프로세스의 주소공간으로 memory mapped 된 가상 주소 공간을 해제합니다. 이는 munmap call과 유사합니다. 차이점은 dlclose는
'Programming > JAVA, C++, Go, Rust' 카테고리의 다른 글
C++ 헤더 내 구현 장/단점 (0) | 2023.01.27 |
---|---|
C++ string split (0) | 2023.01.27 |
dlopen, floating point exception (0) | 2023.01.25 |
unordered_map vs. map (0) | 2023.01.25 |
std::copy (0) | 2023.01.13 |