Linux so 규칙: .so 링크가 개발 패키지에서 나오나요?

Linux so 규칙: .so 링크가 개발 패키지에서 나오나요?

내 Ubuntu jammy Linux PC에서 apt-get install libuv1libuv1 패키지( )를 설치한 후 다음과 같은 이름의 파일 libuv.so.1.0.0과 다음 이름의 심볼릭 링크 가 있음을 확인했습니다 libuv.so.1.

$ find /usr -name "libuv.so*" 2>/dev/null
/usr/lib/x86_64-linux-gnu/libuv.so.1.0.0
/usr/lib/x86_64-linux-gnu/libuv.so.1
$ ls -l /usr/lib/x86_64-linux-gnu/libuv.so*
lrwxrwxrwx 1 root root     14 Jan 15  2022 /usr/lib/x86_64-linux-gnu/libuv.so.1 -> libuv.so.1.0.0
-rw-r--r-- 1 root root 198744 Jan 15  2022 /usr/lib/x86_64-linux-gnu/libuv.so.1.0.0
$

libuv.so아마도 불완전한 이해로 인해 심볼릭 링크 도 있을 것으로 예상했습니다 /usr/lib/x86_64-linux-gnu/libuv.so -> libuv.so.1.

나는 이러한 심볼릭 링크 존재/부재의 혼합을 보았지만 .so그 뒤에 이유/관습이 있는지 제대로 이해하지 못했습니다.

아마 제가 답을 우연히 찾았던 것 같아요이 블로그 게시물. 게시물의 내용을 올바르게 이해한 경우:

  • .so 파일의 의미론적 버전(예: 심볼릭 libfoo.so.1.0.0링크가 최종적으로 확인되는 실제 파일 soname)gcc -I . foo.c -shared -Wl,-soname=libfoo.so.1 -o libfoo.so.1.0.0
  • 이 옵션이 사용되기 때문에 soname바이너리가 -lfoo(링크가 존재하는 환경에서 )로 컴파일될 때 컴파일러/링커는 으로 컴파일된 것으로 확인 libfoo.so -> libfoo.so.1 -> libfoo.so.1.0.0되는 를 찾습니다. 따라서 바이너리는 다음이 필요하다는 것을 알게 됩니다. 런타임에 컴파일됩니다 . (즉, 유사한 내용이 바이너리 파일에 출력됩니다 )libfoo.solibfoo.so.1.0.0-soname=libfoo.so.1libfoo.so.1
    readelf -d0x0000000000000001 (NEEDED) Shared library: [libfoo.so.1]
  • libfoo.so.1 -> libfoo.so.1.0.0바이너리는 (즉, 없음) 환경에서 실행될 때 잘 실행됩니다 . 위에서 언급한 이유로 인해 대신 , libfoo.so -> libfoo.so.1을 찾습니다 .libfoo.so.1libfoo.so

내 추측: 이것은 당신이개발하다공유 라이브러리의 경우 플래그를 지정해야 하므로 심볼릭 링크가 필요합니다. 예를 들어 libfoo.so이 경우 컴파일러 /링커가 대신 이를 찾는다는 의미입니다 .-lg++ use-foo.cpp -o ./use-foo -lfoo-lfoolibfoo.solibfoo.so.*

위의 내용은 동적으로 연결된 간단한 hello-world 예제를 컴파일하고 패키지와 함께 설치된 libuv1항목을 확인하는 것으로 보입니다 libuv1-dev.

$ apt-file list libuv1 | grep so.*
libuv1: /usr/lib/x86_64-linux-gnu/libuv.so.1
libuv1: /usr/lib/x86_64-linux-gnu/libuv.so.1.0.0
$
$ apt-file list libuv1-dev | grep so.*
libuv1-dev: /usr/lib/x86_64-linux-gnu/libuv.so
$

그런데 파일을 발견한 순간 작업이 중단됐고,심볼릭 링크가 아님, 예를 들면 다음과 같습니다 libmemusage.so(예제를 무작위로 선택했습니다).

$ ls -l /usr/lib/x86_64-linux-gnu/libmemusage.so
-rw-r--r-- 1 root root 18904 Sep 25 07:45 /usr/lib/x86_64-linux-gnu/libmemusage.so

내 질문은 다음과 같습니다libfoo.solibfoo.so.x, , 및 사이의 관계 libfoo.so.x.y.z, 이들의 특정 조합이 존재해야 하는 시기와 이유, 이들 중 하나가 파일 또는 심볼릭 링크여야 하는 시기와 이유를 설명하는 포괄적인 규칙이 있습니까 ?

개발자가 아닌 Linux PC 사용자로서 "누락된" 심볼릭 링크를 생성해야 하는 상황이 있습니까(예: 질문 시작 부분에서 봤지만 libuv.so.1보지 못했음 libuv.so)? (이 질문에 대한 배경: 과거 libfoo.so에는 libfoo.so.x및/또는 존재할 때 "누락된" 심볼릭 링크를 생성하라는 요청을 받았지만 libfoo.so.x.y.z"항상 존재한다"는 설익은 개념 외에 이것이 왜 필요한지 제대로 이해하지 못했습니다. 하나의 파일 더미가 있고 "해당" 파일 이 .so있는 것 같습니다 )..so.x.so.x.y.z


(이 질문이 어떻게 스택 오버플로에 속할 수 있는지 알 수 있습니다. 프로그래밍과는 아무 관련이 없지만 궁극적으로 질문의 핵심은 Unix/Linux 규칙에 관한 것이라고 생각합니다. 그러나 결정되면 이 질문이 스택 오버플로에 더 적합합니다. )

관련 정보