누군가 나에게 "나는 라이브러리를 로드할 때 Linux에서 심볼릭 링크가 사용되지 않는다는 것을 알고 있습니다."라고 말했습니다.
그러나 이것은 나에게 올바른 것 같지 않습니다. Linux를 사용하다 보면 깨진 심볼릭 링크를 수정해야 하는 경우가 종종 있습니다.
기호 링크, 작동 방식, 생성 방법에 대한 정보를 찾을 수 있습니다.
공유 라이브러리와 정적 라이브러리에 대한 정보와 작동 방식을 찾을 수 있습니다.
하지만 라이브러리를 로드할 때 심볼릭 링크를 사용하는 라이브러리 로드 프로세스를 설명하는 문서를 찾을 수 없습니다. 특히 여러 버전의 라이브러리가 있는 경우 더욱 그렇습니다.
Linux에서 라이브러리를 로드하기 위해 기호 링크를 사용하는 방법을 설명하는 문서를 알려줄 수 있는 사람이 있습니까?
고쳐 쓰다
조사한 결과 이 사람은 .so
라이브러리를 로드할 때 심볼릭 링크를 사용하지 않는다는 뜻이라고 생각합니다.
답변1
두 개념이 서로 다른 추상화 수준에서 구현되므로 동적 라이브러리가 심볼릭 링크를 사용하는 방법을 설명하는 문서를 찾을 가능성이 없습니다. 심볼릭 링크는 파일 시스템에 속하며 애플리케이션과 동적 라이브러리에 투명합니다. 프로그램에서 파일은 실제 파일이든 심볼릭 링크이든 관계없이 단지 파일일 뿐입니다. 모든 내부 작업은 운영 체제 커널 내에 숨겨져 있습니다.
답변2
알고 보니 라이브러리 연결 과정을 이해하지 못하는 것 같습니다.
컴파일 후 라이브러리가 프로그램에 링크되면 .so.XX
버전이 아닌 라이브러리의 이름(일반적으로 XX가 버전 번호인 파일)에 링크됩니다 .so
.
ldd
애플리케이션을 실행하면 다음이 표시됩니다.
> ldd /opt/GSix/bin/MyApplication
linux-vdso.so.1 (0x00007ffcefff0000)
/usr/lib64/libsyslognb.so (0x00007fe1eacbc000)
librt.so.1 => /lib64/librt.so.1 (0x00007fe1eaab4000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fe1ea897000)
libQt5Widgets.so.5 => /usr/local/Trolltech/Qt-5/lib/libQt5Widgets.so.5 (0x00007fe1e99f5000)
libQt5Gui.so.5 => /usr/local/Trolltech/Qt-5/lib/libQt5Gui.so.5 (0x00007fe1e9143000)
libQt5Core.so.5 => /usr/local/Trolltech/Qt-5/lib/libQt5Core.so.5 (0x00007fe1e894d000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fe1e85d2000)
libm.so.6 => /lib64/libm.so.6 (0x00007fe1e82d4000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fe1e80c2000)
libc.so.6 => /lib64/libc.so.6 (0x00007fe1e7d24000)
각 라이브러리에는 .so
주요 버전을 가리키는 .so.X
심볼릭 링크 버전이 있습니다. 하지만 ldd
앱이 해당 .so
버전에 연결되어 있지 않은 것으로 표시됩니다.
이는 여러 버전의 라이브러리를 시스템에 설치할 수 있고 각 응용 프로그램이 다른 버전과 충돌하지 않고 필요한 버전만 로드하기 때문에 의미가 있습니다.
예를 들어 컬 라이브러리는 다음과 같습니다.
16 libcurl.so -> libcurl.so.4
16 libcurl.so.4 -> libcurl.so.4.4.0
387K libcurl.so.4.4.0
16 libcurl.so.3 -> libcurl.so.3.1.0
387K libcurl.so.3.1.0
MyApplication이 버전 4에 연결되고 YourApplication이 버전 3에 연결된다고 가정합니다.
두 애플리케이션 모두 libcurl.so를 찾고 있는 경우 YourApplication은 libcurl.so
.so에 대한 심볼릭 링크이므로 로드되지 않습니다 libcurl.so.4
.
이것이 바로 애플리케이션이 .so.X
버전 대신 버전을 로드해야 하는 이유입니다 .so
.