C++ 바이너리를 탐색하는 동안 dyn이 및 libstdc++.so.6
에 연결되어 있음 을 발견했습니다 .libm.so.6
libc.so.6
$ ldd /lib/x86_64-linux-gnu/libstdc++.so.6
linux-vdso.so.1 (0x00007ffcb737b000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd3b2295000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd3b1c00000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd3b2396000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fd3b2275000)
내 질문은 다음과 같습니다
6
이름은 무엇을 의미합니까? 원래는 glibc 버전인줄 알았는데 알고보니 glibc 버전2.35
과 똑같 더군요6
.$ strings /lib/x86_64-linux-gnu/libc.so.6 | grep GLIBC_2.3 GLIBC_2.3 ... GLIBC_2.35
이 접미사가 왜
6
그렇게 인기가 있습니까?libc.so.7
언제 출시되는지 시간표가 있나요?
답변1
6 접미사는 역사적인 이유로 사용됩니다.man libc
리눅스에서. 기본적으로 Linux에서는 GNU C 라이브러리의 포크가 사용됩니다. 이번에는 주요 버전 2부터 5까지 출시되었습니다. 버전 5는 ELF를 사용하며 공유 라이브러리 soname 으로 배포됩니다 libc.so.5
. GNU C 라이브러리 버전 2가 Linux에 출시되었을 때 libc.so.6
이전 라이브러리와의 혼동을 피하기 위해 공유 라이브러리 soname을 사용했습니다.
관련 라이브러리는 동일한 접미사를 사용합니다. 일부 아키텍처는 약간 다른 접미사를 사용합니다. 예를 들어 Alpha 및 Itanium의 GNU C 라이브러리는 libc.so.6.1
.
GNU C 라이브러리는 이전 버전과의 호환성에 대한 강력한 역사를 갖고 있으며 다양한 메커니즘을 사용하여 이전 바이너리(버전이 지정된 기호 포함)를 손상시키지 않고 주요 변경 사항의 도입을 지원합니다. 새로운 soname()은 완화할 수 없는 주요 변경 사항이 절대적으로 필요한 경우에만 사용되므로 libc.so.7
조만간 그러한 변경 사항을 볼 가능성은 거의 없습니다.
답변2
이것이 ABI(애플리케이션 바이너리 인터페이스) 버전.
이는 주요 변경이 이루어질 때만 증가하며 현재는 이를 강력히 방지하므로 대부분의 배포판에서는 한동안 libc
이 작업이 작동했습니다 .libc.so.6
일반적으로 이를 통해 호환되지 않는 여러 버전의 라이브러리가 시스템에 동시에 존재할 수 있으며, 다양한 버전용으로 구축된 다양한 애플리케이션을 지원할 수 있습니다.
예를 들어 Ubuntu 18.04는 cURL 버전 7.58.0에서 빌드된 libcurl.so.3
(패키지를 통해 libcurl3
) 및 libcurl.so.4
(패키지를 통해 )을 제공합니다.libcurl4