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 를 포함해서 재빌드 해야 됨