이전 gcc 버전을 어떻게 빌드합니까? crti.o를 찾을 수 없다는 오류

이전 gcc 버전을 어떻게 빌드합니까? crti.o를 찾을 수 없다는 오류

Ubuntu 11.10에서 이전 gcc(구체적으로 4.5.2)를 빌드하고 "/usr/bin/ld: crti.o를 찾을 수 없습니다: 해당 파일 또는 디렉터리가 없습니다"에 대한 오류를 방지하려면 어떻게 해야 합니까?

약간의 조사를 수행하여 유사한 항목을 여러 개 찾았지만 실제로 문제를 해결하는 항목은 없습니다.

  • 내 모든 패키지(libc6-dev 등)가 다음에 따라 다시 설치되었는지 확인했습니다.이 질문
  • crti.o가 /usr/lib32 및 /usr/lib/x86_64-linux-gnu에 존재하고 내 ld.so.conf가 해당 디렉토리를 찾도록 구성되어 있음을 확인했습니다.
  • LIBRARY_PATH=/usr/lib/x86_64-linux-gnu를 사용하여 make 호출 앞에 추가하는 것이 작동하는지 확인했지만 이를 피하고 싶습니다(makefile에서 분기점이 됩니다).
  • --with-build-sysroot를 사용하여 다양한 작업을 시도했지만 성공하지 못했습니다. (읽기: 설정할 올바른 플래그를 모르는 것일 수도 있습니다.)
  • strace로 실행할 때 (에 따라이 답변), crti.o에 대한 참조를 볼 수 있습니다.

    13240 open("crti.o", O_RDONLY) = -1 ENOENT(해당 파일이나 디렉터리가 없음)

감사해요!

답변1

매우 새로운 버전의 GCC조차도 해당 메시지와 함께 실패합니다. 이는 새로운 Debian/Ubuntu 릴리스가 다중 아키텍처(즉, 하나의 파일 시스템에 여러 시스템에 대한 바이너리 설치)를 지원하므로 라이브러리가 표준 위치에서 멀어졌기 때문입니다.

이를 해결하기 위한 GCC 패치가 있습니다.여기(아직 최종 버전이 승인되지 않았지만 Ubuntu에는 정확함) 아마도 많은 노력 없이도 이전 GCC에 적용될 수 있습니다. 내 생각에는 GCC를 다음과 같이 구성해야 한다고 생각합니다.--enable-multiarch, 또는 뭔가.

그동안 소프트 링크를 만드는 것이 좋은 해결 방법입니다.

cd /usr/lib
ln -s x86_64-linux-gnu/crt*.o .

(32비트 설치에서는 폴더 이름이 다릅니다.)

도움이 되길 바랍니다.

답변2

나는 같은 문제가 있었다. 나에게 문제를 해결하기 /usr/libs/crt?.o 위해 심볼릭 링크를 만듭니다 ./usr/lib/x86_64-linux-gnu/crt?.o

답변3

저는 여러분에게 유용할 수 있는 몇 가지 해결 방법으로 이 문제를 해결했습니다.

먼저, LIBRARY_PATH=/usr/lib/x86_64-linux-gnu빌드 부트스트랩 프로세스가 시작 파일을 찾을 수 있는 위치를 알 수 있도록 를 사용하여 GCC를 빌드합니다 crt?.o.

그런 다음 전체 시스템에 영향을 미치는 위치 crt?.o에 심볼릭 링크를 만드는 대신 해당 세 파일을 실행 파일이 설치된 디렉터리 에 해당하는 디렉터리 에 심볼릭 링크할 수 있습니다 . 이는 실제로 시작 파일에 대한 검색 경로의 거의 맨 위에 있으므로 하지만 다른 어떤 것에도 영향을 미치지 않습니다./usr/lib${prefix}/lib/gcc/...${prefix}/bingcc

내 경우에는 이를 넣을 특정 디렉토리는 lib/gcc/x86_64-unknown-linux-gnu/4.3.2/; 이미 crtbegin.o그 안에 같은 다른 파일이 있기 때문에 올바른 파일을 찾을 수 있습니다 .

답변4

Ubuntu 정확한 x86_64에 GCC 4.1.2를 구축했습니다. 그랬듯이 32비트 C 런타임을 찾는 마지막 명령 "xgcc"의 strace, grep-ped /32/를 다음과 같이 살펴보았습니다. 내 C 런타임은 libc6-dev-i386 패키지에서 제공하는 /usr/lib32에 있습니다.

fgrep /32/ strace-output.txt | grep /usr/lib | head -1
access("/usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32/crti.o", R_OK) = -1 ENOENT (No such file or directory)

그래서 xgcc가 찾은 디렉토리에 crt?.o 심볼릭 링크를 만들었습니다.

sudo mkdir -p /usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32
cd /usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32
sudo ln -s /usr/lib32/crt1.o 
sudo ln -s /usr/lib32/crtn.o 
sudo ln -s /usr/lib32/crti.o 

나는 그것으로 GCC 4.1.2를 성공적으로 구축했습니다.

관련 정보