shared library 이해 및 만들기


1) shared library

  - Windows 에서는 .dll , Linux, macos 에서는 .so


2) soname

  - compile time 에서는 .so 를 참조하며 runtime 시 .so.{version} 의 파일을 참조

  - 실제 library 파일은 .so.{major}.{minor}... 등의 형태로 사용

[참고: https://kldp.org/node/85366]


3) 빌드방법

 - Linux :

    . gcc -c -fPIC -o output source

    . gcc -shared -Wl,-soname,"libraryname".so.{major version} -o "libraryname".so.{major}.{minor} object


 - macos :

    . gcc -shared -Wl,-install_name,"libraryname".so.{major version} -o "libraryname".so.{major}.{minor} object


4) soname 과 ABI

  - library major 변경이 아닌 경우 재빌드 없이 사용할수 있게 해줌

  - libwaintman.so.1.1 라이브러리가 soname 이 libwaintman.so.1 일때,

    TEST 모듈이 libwaintman.so.1.1 을 참조하게 되면 compile 타임에 libwaintman.so 를 참조함

    . libwaintman.so --> libwaintman.so.1

    . libwaintman.so.1 --> libwaintman.so.1.1

    일 때, TEST 모듈은 빌드될때 libwaintman.so.1.1를 참조하게 됨

 

    TEST 모듈이 실행 될 때 soname 인 libwaintman.so.1 을 찾게 됨

    이 때 libwiantman.so.1 이 libwaintman.so.1.3 버전을 가리키고 있어도 정상적으로 실행이 됨


    정상적으로 실행이 안될 경우 libwaintman.so.1.1 과 libwaintman.so.1.3 은 major 변경이 일어난 경우 이므로

    libwaintman.so.1.3 soname 은 libwaintman.so.2 와 같이 변경이 되어야 함.

    이렇게 되면 TEST 모듈이 실행 될 때 libwaintman.so.1 이 시스템에 없으므로 실행이 되지 않으며

    TEST 를 libwaintman.so.2 를 포함해서 재빌드 해야 됨

+ Recent posts