centos libc.6.so 링크 오류
2681 단어 linux 시스템 지식
문제
서버는centos5.8을 사용합니다.libc가 몇 번 등장했습니다.6.so의 기초 라이브러리는yum로 소프트웨어를 설치할 때 링크가 바뀌었고 모든 시스템 명령을 사용할 수 없습니다.다음과 같은 그림이 표시됩니다.
Linux의 많은 명령은 이 C 언어에 의존하는 동적 링크 라이브러리입니다. centos에서 이것은 소프트 체인입니다. 교체된 후에 새로운 버전의 동적 라이브러리로 교체될 때 이 문제가 발생합니다.여기는 버전 2.5에서 2.12로 바뀌었습니다.
원인
구글에서 검색한 답:
The loader on your system does not support the new Linux ABI. Until relatively recently, Linux ELF binaries used the System V ABI. Recently, in support of STT_GNU_IFUNC, the Linux ABI was added. You would have to update your system C library to have a loader that support STT_GNU_IFUNC, and then it will also recognize ELF objects with the Linux ABI type.
즉, 시스템 버전의 동적 라이브러리 캐리어가 너무 낡아서 새로운 버전의 동적 라이브러리를 지원하지 않습니다. 시스템의 캐리어를 업그레이드하든지, 낡은 라이브러리로 복구하든지.
LD_로PRELOAD 수정
문제가 발생한 후 거의 모든 명령을 사용할 수 없습니다. 왜냐하면 그 새 버전의 동적 라이브러리를 불러올 수 없기 때문입니다
LD_PRELOAD
환경 변수는 명령을 실행하기 전에 불러오는 동적 라이브러리를 지정할 수 있습니다.LD_PRELOAD는 이러한 환경 변수입니다. 프로그램이 실행될 때의 링크(Runtime linker)에 영향을 줍니다. 프로그램이 실행되기 전에 우선적으로 불러오는 동적 링크 라이브러리를 정의할 수 있습니다.이 기능은 주로 서로 다른 동적 링크 라이브러리의 같은 함수를 선택적으로 불러오는 데 쓰인다.이 환경 변수를 통해 우리는 메인 프로그램과 동적 링크 라이브러리 중간에 다른 동적 링크 라이브러리를 불러올 수 있고 심지어 정상적인 함수 라이브러리를 덮어쓸 수 있다.
아래와 같은 명령을 실행하면 바로 회복할 수 있다.그러나 명령을 실행하려면 루트 권한이 있어야 합니다. sudo 명령은 사용할 수 없습니다. (다른 동적 라이브러리를 불러올 수도 있습니다.)
root# LD_PRELOAD=/lib64/libc-2.5.so ln -sf /lib64/libc-2.5.so /lib64/libc.6.so
sln 명령으로 고치기
많은 사람들이 이 명령을 모를 것입니다. 이 명령은/sbin/디렉터리에 있습니다. man의 설명은 이렇습니다.
sln symbolically links
dest
to source
. It is statically linked, needing no dynamic linking at all. Thus sln is useful to make symbolic links to dynamic libraries if the dynamic linking system for some reason is nonfunctional. 보기에 동적 라이브러리의 문제를 복구하기 위해 한 것으로 보인다. 이것은 정적 링크가 생성된 명령으로 어떠한 동적 라이브러리에도 의존하지 않고 사용 방법은 ln과 같다.
root# /sbin/sln -sf /lib64/libc-2.5.so /lib64/libc.6.so
loader 정보
이 질문에 대한 외국인의 대답은 다음과 같다.
Ah, I didn’t realize you had replaced the system C library without also replacing the loader, or I would have been more specific in my advice.
즉,libc를 업그레이드해야 합니다.6. so는 동적 라이브러리의loader를 동시에 업그레이드해야 한다.제 시스템의ld동적 라이브러리 버전도 2.5입니다. libc를 업그레이드해야 할 것 같습니다.6.so는 ld를 같은 버전으로 업그레이드해야 합니다.이쪽 시스템이 복구되어 다시는 움직이지 못하고 다시 시도하지 않았으며 나중에 만나서 보충하겠습니다.