Dynamic Loading DSO (Dynamic Shared Object)

2023. 1. 26. 11:36Programming/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