x64(현재 아키텍처)용으로 컴파일된 프로그램( foo
여기서 부르겠습니다)이 있습니다. 실행하려고 하면 다음과 같이 나타납니다.
./foo: error while loading shared libraries: libgmp.so.3: cannot open shared object file: No such file or directory
출력의 관련 부분 locate
:
/usr/lib/x86_64-linux-gnu/libgmp.so
/usr/lib/x86_64-linux-gnu/libgmp.so.10
/usr/lib/x86_64-linux-gnu/libgmp.so.10.1.3
주위를 둘러보던 중 이런 질문을 발견했습니다.민트: /lib/i386-linux-gnu/libgmp.so.3을 설치하는 올바른 방법, 작성자는 "x86_64 설치가 필요한 32비트 바이너리가 있습니다."라고 말했습니다 . 해당 스레드에서 그들은 오류를 추가 하고 변경 하기 libgmp.so.3
위해 Ubuntu 패키지의 컴파일된 32비트 버전을 설치할 것을 제안했습니다 ( 예상대로)/usr/lib/libgmp.so.3
/usr/lib/libgmp.so.3.5.2
locate libgmp
./foo: error while loading shared libraries: libgmp.so.3: wrong ELF class: ELFCLASS32
그래서 저는 바이너리 제작자에게 편지를 보냈고 그는 매우 유용하게 다시 컴파일했지만 라이브러리가 이제 140MB이므로 최선의 선택은 직접 다시 컴파일하는 것이라고 답장했습니다.
쌍에 대한 바이너리 종속성이 libgmp.so.3
충족 되지 않는 이유는 무엇입니까 libgmp.so.10
?
이것은 소프트웨어가 특정 라이브러리 버전에만 의존한다는 것을 의미합니까? 이것이 "소프트 코딩"이 아닐까요?
공유 라이브러리는 항상 이전 버전과의 호환성을 깨뜨립니까(그렇지 않다고 생각합니다)?
내 선택은 다음과 같습니다.
ㅏ. libgmp.so.3
x64 다운로드 및 컴파일
b. 소프트웨어를 다시 컴파일합니다.
씨. 런타임 위험: libgmp.so.10
(실제로는 ) 사용할 링크를 작성할 수 있나요 libgmp.so.3
?
작동할까요? 장점/단점은 무엇입니까?
첨부된:
추가: bin의 ldd
linux-vdso.so.1 => (0x00007fff290fa000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f8061064000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f8060e46000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8060b3f000)
libbz2.so.1 => /lib/x86_64-linux-gnu/libbz2.so.1 (0x00007f806092f000)
llibz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f8060716000)
libgmp.so.3 => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8060350000)
/lib64/ld-linux-x86-64.so.2 (0x00007f80612a0000)
답변1
/usr/lib/x86_64-linux-gnu/
ldd 출력에서 공유 라이브러리 검색을 아는 경로에 있는 것처럼 보이지 않습니다 . 슈퍼유저 권한으로 실행하여 이를 확인할 ld
수 있습니다 ldconfig -v
. 그러면 LD가 찾을 수 있는 모든 공유 라이브러리 목록이 출력됩니다. 해당 목록에서 libgmp를 찾을 수 없는 경우 라이브러리 검색 경로에 넣도록 /etc/ld.so.conf.d/[your-system-arch].conf
라이브러리 를 편집해야 합니다 ./usr/lib/x86_64-linux-gnu/