gcc 5.1.0을 설치한 후, firefox, gnome과 같은 많은 프로그램을 사용할 수 없다는 것을 발견했습니다. "GLIBC_2.1X를 찾을 수 없습니다"라는 메시지가 표시되었습니다. 이제 GLIBC 버전이 이전보다 높아져서 이러한 프로그램을 사용할 수 없습니다. gcc 5.1.0을 설치하면 GLIBC가 더 높은 버전이 되기 때문인 것 같습니다.
기존 소프트웨어가 제대로 작동하도록 Linux를 저장하고 gcc를 만들려면 어떻게 해야 합니까?
답변1
질문
대체로 순환 종속성 문제가 있습니다. 나이것은 내 다른 답변에서 복사되었습니다., 단순히 연결하는 것만으로는 그렇게 되지 않기 때문입니다. 이 문제는 GCC 5.1.0의 바이너리 버전을 설치하거나 소스에서 컴파일할 때 발생합니다. GLIBC에는 시스템의 모든 패키지에 필요한 기호와 국제화 코드가 포함되어 있기 때문에 시스템의 모든 패키지(바이너리 여부에 관계없이)가 암시적으로 GLIBC에 종속되기 때문에 다음 논의가 발생합니다. 주요 예는 다음과 같습니다:
- 언어 인코딩
- 통화 기호
- 날짜 형식
- 계산 형식
- 소수 구분 기호 위치
- 구분자 유형, 쉼표 십진수 등
GCC를 업그레이드하면 GLIBC가 업그레이드되고 GLIBC를 업그레이드하면 위 목록 등이 중단됩니다. 이 문제를 해결하는 유일한 방법은 GCC 및 GLIBC를 업그레이드한 후 시스템의 모든 패키지를 다시 컴파일하거나 다시 설치하는 것입니다.툴체인 - Ubuntu 관련 - 바이너리 배포 유형,그리고툴체인에 대한 일반적인 설명.
소스 코드 기반 패키지를 바이너리 패키지 기반 시스템과 혼합하는 것은 버전 불일치가 쉽게 발생할 수 있기 때문에 거의 불가능합니다. 다음을 고려하세요:
- 바이너리 패키지 버전 A는 종속성 버전 B에 종속되며 종속성 버전 B에서만 사용할 수 있습니다. 종속성 버전 B는 라이브러리 C를 사용합니다.
- 연결 1(바이너리 패키지 버전 A)의 논리도 암시적으로 라이브러리 C에 종속됩니다.
- 라이브러리 버전 D(C = 1.0, D = 1.1인 경우)로 종속성 버전 B를 구축했습니다.
- 종속성 버전 B는 성공적으로 빌드되었지만 바이너리 패키지 버전 A는 여전히 라이브러리 버전 C에 연결되어 있으므로 라이브러리 버전 C의 기호가 버전 D의 최신 기호로 대체되었기 때문에 이제 바이너리 패키지 A가 확인되지 않은 기호를 로드합니다.
- 라이브러리 버전 D가 라이브러리 버전 C를 대체했기 때문에 개발자는 새 버전 D를 버전 C에 연결하지 않기로 결정했습니다.
- 이 문제를 해결하려면 라이브러리 버전 C에 연결되는 시스템의 모든 패키지를 라이브러리 버전 D로 다시 컴파일해야 합니다.
바이너리 시스템의 모든 패키지가 미리 패키지되어 있고 소스에서 컴파일할 때 일부 또는 전체가 손상되기 때문에 여기서 멈췄습니다.
해결책
패키지 관리자 도구를 사용하여 gcc-5.1.0 및 GLIBC를 다운그레이드해 보세요. 패키지 관리자가 작동하지 않으면 배포판을 거꾸로 설치하는 것보다 다시 설치하는 것이 더 쉽습니다.
답변2
gcc
컴파일하기 위해 업그레이드할 필요는 없습니다 GLIBC
. 나는 이것을 여러 번 해왔으며 일반적으로 새로운 만큼의 버전과 버전이 필요 binutils
합니다 gmp
. 사실, 이것들은 서로 아무런 관련이 없습니다. 내 말은, 당신이 변화한다면 .mpfr
mpc
GLIBC
gcc
gcc
그러나 직접 컴파일한 버전을 설치하는 경우 ,이 시스템 전체를 사용하지 마십시오.: 이는 가능하며 직접 변경할 수 있습니다 GLIBC
. 대신 gcc
집에서 작업 버전을 유지하고 런타임 정보를 제공하여 올바른 라이브러리에 연결할 수 있습니다(조정을 통해 LD_LIBRARY_PATH
).
이제는 GLIBC
(적어도 어느 정도) 상위 호환성이 아닌 이전 버전과의 호환성입니다. GLIBC
업데이트를 직접 수행하지 않았다면 설치한 버전이 최신 버전을 사용하고 있다는 의미일 뿐입니다 . gcc
예 GLIBC
를 firefox
들어 다음 링크를 참조하세요.
linux-vdso.so.1 (0x00007fff92d8a000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007ff8a7711000)
libdl.so.2 => /usr/lib/libdl.so.2 (0x00007ff8a750d000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007ff8a718b000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007ff8a6e87000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007ff8a6ae5000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff8a792e000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007ff8a68cf000)
이들 중 대부분은 에서 제공됩니다 gcc
(따라서 GLIBC
오류는 firefox
실제로 에서 발생합니다 gcc
).
두 번째 가능성은 업데이트했다는 것입니다 GLIBC
(설치 방법에 따라 gcc
사용 중인 저장소에 최신 버전이 있는 것처럼 간단할 수도 있습니다). GLIBC
이 경우에는 문제가 되지 않습니다. 이전 버전으로 컴파일된 프로그램은 GLIBC
(제한된 범위 내에서) 최신 버전에서 작동해야 합니다. 그러나 일부 프로그램은 GLIBC
여러 가지 이유로 매우 구체적인 버전을 계속 참조합니다. 그래서 그럴 수도 있습니다.
이 엉망진창을 복원하려면...
외부 저장소를 사용 중이고 여전히 패키지를 설치할 수 있는 경우 저장소를 삭제하고 다운그레이드하면 됩니다.
수동으로 설치한 경우 gcc
언제든지 저장소 버전을 다시 설치해 볼 수 있습니다. 하지만 너무 기대하지는 마십시오. 배포판을 다시 설치해야 할 수도 있습니다.