ldd 프로그램에서 내 공유 라이브러리에 필요한 일부 공유 라이브러리가 누락되었다고 보고합니다. (Red Hat Linux 7을 사용하는 다른 컴퓨터에서 구축했으며 Red Hat Linux 6을 사용하는 다른 컴퓨터에서 실행하고 싶습니다.)
아래 버전 정보 섹션에는 libc.so.6에 대한 세 가지 항목이 있으며 각 항목은 괄호 안에 서로 다른 버전이 있습니다(GLIBC_2.14, GLIBC_2.4 및 GLIBC_2.2.5). 첫 번째는 머신에 연결된 공유 라이브러리가 설치되어 있지 않습니다.
저는 Linux를 처음 접했고 문제 해결은커녕 이 출력을 해석하는 방법도 이해하지 못합니다. 다음은 명령과 출력입니다.
>ldd -v libAtlasUtilsPB.so
./libAtlasUtilsPB.so: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./libAtlasUtilsPB.so)
./libAtlasUtilsPB.so: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.18' not found (required by ./libAtlasUtilsPB.so)
./libAtlasUtilsPB.so: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ./libAtlasUtilsPB.so)
linux-vdso.so.1 => (0x00007fffa3dff000)
librt.so.1 => /lib64/librt.so.1 (0x00007fea7a7b2000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fea7a4ab000)
libm.so.6 => /lib64/libm.so.6 (0x00007fea7a227000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fea7a011000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fea79df3000)
libc.so.6 => /lib64/libc.so.6 (0x00007fea79a5f000)
/lib64/ld-linux-x86-64.so.2 (0x00007fea7ad17000)
Version information:
./libAtlasUtilsPB.so:
libgcc_s.so.1 (GCC_3.0) => /lib64/libgcc_s.so.1
libm.so.6 (GLIBC_2.2.5) => /lib64/libm.so.6
libpthread.so.0 (GLIBC_2.2.5) => /lib64/libpthread.so.0
libc.so.6 (GLIBC_2.14) => not found
libc.so.6 (GLIBC_2.4) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
libstdc++.so.6 (GLIBCXX_3.4.18) => not found
libstdc++.so.6 (GLIBCXX_3.4.15) => not found
libstdc++.so.6 (GLIBCXX_3.4.9) => /usr/lib64/libstdc++.so.6
libstdc++.so.6 (GLIBCXX_3.4.11) => /usr/lib64/libstdc++.so.6
libstdc++.so.6 (CXXABI_1.3) => /usr/lib64/libstdc++.so.6
libstdc++.so.6 (GLIBCXX_3.4) => /usr/lib64/libstdc++.so.6
답변1
ldd
인수에 필요한 공유 라이브러리를 나열하십시오. 이 -v
옵션을 사용하면 버전 기호를 포함하여 사용 가능한 모든 정보가 나열됩니다.
테이블의 줄
linux-vdso.so.1 => (0x00007fffa3dff000)
librt.so.1 => /lib64/librt.so.1 (0x00007fea7a7b2000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fea7a4ab000)
필요한 라이브러리 libAtlasUtilsPB.so
와 귀하의 경우 구문 분석 방법을 모두 나열하십시오.도서관찾을 수 있습니다. linux-vdso.so.1
아주 특별해요, 그렇죠가상 도서관커널에서 제공됩니다.
테이블의 줄
libgcc_s.so.1 (GCC_3.0) => /lib64/libgcc_s.so.1
libm.so.6 (GLIBC_2.2.5) => /lib64/libm.so.6
libpthread.so.0 (GLIBC_2.2.5) => /lib64/libpthread.so.0
필수 버전 기호 libAtlasUtilsPB.so
와 이를 해결하는 방법을 나열합니다. 이는 ldd
항목을 해결할 수 없는 곳으로, 여기에 "찾을 수 없음"을 표시하고 출력 시작 부분에 오류 메시지를 인쇄하여 표시됩니다.
GLIBC_...
등은 GLIBCXX_...
GNU C 라이브러리, GCC 라이브러리 등 일부 라이브러리에서 필요한 버전을 식별하고 하위 호환성을 관리하는 데 사용되는 버전 기호입니다. 바이너리(실행 파일 또는 라이브러리)는 대상 라이브러리에서 실제로 사용하는 기호에 따라 여러 버전이 필요한 경우가 많습니다. 특정 바이너리의 요구 사항을 충족하려면 필요한 모든 버전을 지원하는 라이브러리를 제공해야 합니다.즉요구 사항 목록에서 최소한 가장 높은 버전 기호와 일치하는 라이브러리입니다.
여러 버전이 필요할 수 있는 이유는 가져온 각 개체(함수 등)가 버전을 가질 수 있고 특정 바이너리가 사용하는 모든 함수의 여러 버전에 연결될 수 있기 때문입니다. 예 를 들어 내 시스템에서 두 가지 버전이 있는 샘플을 선택 /lib/x86_64-linux-gnu/libgcc_s.so.1
하면ldd -v
/lib/x86_64-linux-gnu/libgcc_s.so.1:
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
libgcc_s.so.1
의 두 가지 버전 기호가 필요합니다 libc.so.6
. 이유를 알아내려면 포함된 정의되지 않은 기호를 살펴봐야 합니다. 가져오기에 필요한 기호는 다음과 같습니다.
$ objdump -T /lib/x86_64-linux-gnu/libgcc_s.so.1|grep -F '*UND*'
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 dl_iterate_phdr
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 free
0000000000000000 w D *UND* 0000000000000000 __pthread_key_create
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 abort
0000000000000000 w D *UND* 0000000000000000 _ITM_deregisterTMCloneTable
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 strlen
0000000000000000 w D *UND* 0000000000000000 pthread_getspecific
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 memset
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 calloc
0000000000000000 w D *UND* 0000000000000000 pthread_key_create
0000000000000000 w D *UND* 0000000000000000 __gmon_start__
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.14 memcpy
0000000000000000 w D *UND* 0000000000000000 pthread_once
0000000000000000 w DF *UND* 0000000000000000 GLIBC_2.2.5 pthread_mutex_unlock
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 malloc
0000000000000000 w D *UND* 0000000000000000 pthread_setspecific
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 realloc
0000000000000000 w D *UND* 0000000000000000 _Jv_RegisterClasses
0000000000000000 w D *UND* 0000000000000000 _ITM_registerTMCloneTable
0000000000000000 w DF *UND* 0000000000000000 GLIBC_2.2.5 __cxa_finalize
0000000000000000 w DF *UND* 0000000000000000 GLIBC_2.2.5 pthread_mutex_lock
여기에는 우리가 본 것과 비교하여 볼 수 있는 여러 버전의 기호( 두 번째 열에 있거나 있는 기호) GLIBC_2.2.5
가 나열되어 있습니다. 여기서는 이전 버전과의 호환성이 중요합니다. 버전 2.2.5는 GNU C 라이브러리의 기호 버전 관리를 위한 기준입니다. 버전 2.2.5에 존재하는 모든 기능에는 해당 버전이 포함됩니다. GNU C 라이브러리 버전 2.13에서는 동작이 변경되어 많은 프로그램이 손상되었습니다. 따라서 버전 2.14에서는 선택적 버전 태그를 사용하여 이전 버전과 호환되는 버전이 배치되었고 버전 태그가 있는 새 버전이 추가되었습니다 . 따라서 이전 버전의 C 라이브러리로 빌드된 이전 바이너리는 이전 버전을 사용하고 , 버전 2.14 이상으로 빌드된 바이너리는 새 버전을 사용합니다 .GLIBC_2.14
ldd
memcpy
GLIBC_2.2.5
GLIBC_2.14
memcpy
memcpy
동일한 내용이 적용되지만 libstdc++.so.6
버전 번호가 업데이트됨에 따라 더 많은 변경 사항이 적용됩니다.설명서에는 libstdc++
자세한 정보가 나와 있습니다..
libstdc++.so.6
귀하의 경우 일치 해야합니다 GLIBCXX_3.4.18
.즉GCC 4.8.0 이상에서 제공되는 버전 및 GNU C 라이브러리 버전 2.14.
RHEL 7에서 바이너리를 쉽게 빌드하고 RHEL 6에서 실행할 수 없습니다(이것이 주요 버전이 다른 이유입니다). RHEL 6에서 프로그램을 다시 빌드하는 것이 좋습니다.