이것은 다소 젠투에만 해당되므로 문맥에 맞게 설명하고 일반 Linux 시스템으로 추상화해 보겠습니다.
내 컴퓨터가 Athlon64였을 때 처음에는 실수로 CHOST를 "i686-pc-linux-gnu"로 설정했습니다. "x86_64-pc-linux-gnu"로 변경하고 싶습니다. 이에 대한 가이드가 있습니다. 이것은 작동하지 않습니다.
첫 번째 단계는 "binutils를 다시 컴파일한 다음 gcc를 다시 컴파일"하는 것입니다.
문제에 대한 설명은 다음과 같습니다.
- gcc를 사용하여 binutils 컴파일 - 새로운 as, ar 등의 파일이 성공적으로 생성되었습니다.
- 이것나머지GCC. gcc는 이제 새로운 /usr/bin/as를 사용하려고 시도하지만 작동하지 않습니다.
- gcc는 아무것도 컴파일할 수 없기 때문에 gcc를 컴파일할 수 없습니다. ar 등으로 되돌린 다음 CHOST 변경 사항을 되돌리고 binutils를 다시 컴파일해야 합니다.
그래서 다음을 시도했습니다.
- ar 등으로 백업
- binutils 컴파일 및 gcc 작동 불능 렌더링
- 내가 백업한 이전 버전에 ar, as 등을 연결합니다.
- gcc를 컴파일해 보세요
다음과 같은 이유로 gcc 컴파일이 실패합니다.
/usr/x86_64-pc-linux-gnu/bin/ld: skipping incompatible /usr/lib/libc.so when searching for -lc
/usr/x86_64-pc-linux-gnu/bin/ld: skipping incompatible /usr/lib/libc.a when searching for -lc
/usr/x86_64-pc-linux-gnu/bin/ld: cannot find -lc
collect2: ld returned 1 exit status
이것glibc 버그(완성 체인)입니다.
그래서 그것은 보인다:
- gcc 컴파일은 glibc의 새 버전에 따라 달라집니다.
- gcc를 실행하려면 binutils가 이전 버전이어야 합니다.
내가 단계아니요너무 복잡하고 먼저 조언을 구하고 싶기 때문에 이것을 시도했습니다.
- 새로운 아키텍처에서 binutil을 컴파일합니다.
- as, ar 등을 이전 실행 파일에 다시 연결
- old-gcc 및 old-binutils를 사용하여 새 glibc 컴파일
- new-gcc를 old-gcc 및 old-binutils와 함께 컴파일하되 new-glibc를 사용하세요.
- as, ars 등을 new-binutils에 다시 연결
- 보스처럼 모든 것을 다시 컴파일하세요
위의 #4가 작동할 수 있습니까? 완전히 다시 설치하지 않고도 이 작업을 수행할 수 있습니까?
답변1
내가 아는 한 이것은 불가능합니다. 툴체인은 진공 상태로 존재하지 않고 서로 연결되어 있다는 점을 기억하십시오.
유용할 수 있는 것은 크로스 컴파일러가 새로운 인프라를 구축하는 것이지만 나는 그것이 정말 의심스럽습니다. glibc 업데이트의 "원자성"은 모든 것을 망칠 것입니다.
시스템을 백업하고 다시 설치하는 것이 좋습니다.
답변2
amd64 stage3 tarball을 다운로드하고 gcc 사본을 사용해 보셨습니까?
답변3
커널이 64비트인 경우(64비트 바이너리를 실행할 수 있음) 일반 지침에 따라 chroot에서 새 x86_64 젠투 설치를 시작할 수 있습니다. 이전에 비슷한 작업을 수행한 적이 있습니다. 효과적으로 재설치했지만 여전히 이전 시스템을 실행하고 있습니다. 마운트할 여유 블록 장치가 없는 경우 init=chroot\040/new\040/bin/sinit
하위 디렉터리를 사용하고 부팅하거나 최소 환경으로 드롭다운하여 디렉터리를 섞을 수 있습니다.
커널이 32비트인 경우 64비트 커널을 찾거나 64비트 크로스 컴파일러를 빌드하여 64비트 커널을 빌드하고 부팅한 후 위를 참조하세요.