이전 gcc 버전을 어떻게 구축합니까? crti.o를 찾을 수 없습니다에 대한 오류


10

Ubuntu 11.10에서 이전 gcc (특히 4.5.2)를 빌드하고 "/ usr / bin / ld : crti.o : not such file or directory"에 대한 오류를 피하려면 어떻게해야합니까?

나는 약간의 파기를하고 몇 가지 유사한 항목을 찾았지만 실제로 내 문제를 해결하는 것은 없습니다.

  • 이 질문에 따라 모든 패키지 (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 (파일 또는 디렉토리가 없음)

감사!

답변:


7

나는 같은 문제가 있었다. 기호 링크를 만들어 문제 /usr/libs/crt?.o/usr/lib/x86_64-linux-gnu/crt?.o해결했습니다.


이것은 작동합니다. 그래도 기본 파일 구조를 다루지 않고 gcc 설치를 조정하는 방법에 더 많은 솔루션을 기대하고있었습니다.
Matt

필자의 경우에는 glibc와 GCC를 다시 컴파일하기를 원했지만 / usr / bin /에있는 오래된 slackware-gcc 변형을 제거하는 것을 잊었습니다. 후자를 제거하면 gcc와 같은 특정 항목을 다시 컴파일 할 수 있습니다.
shevy

10

새 버전의 GCC조차도 해당 메시지로 실패합니다. 새로운 데비안 / 우분투 릴리즈는 멀티 아키텍처 (즉, 하나의 파일 시스템에 여러 머신의 바이너리 설치)를 지원하기 때문에 라이브러리가 표준 위치에서 멀어지기 때문입니다.

이 GCC는 그것을 해결하기 위해 패치입니다 여기에 (아직 최종 버전을 승인하지만, 우분투 정확하지), 그들은 아마 아마, 많은 노력없이 나이가 GCC에 적용됩니다. --enable-multiarch 또는 다른 것으로 GCC를 구성해야한다고 생각합니다 .

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

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

폴더 이름은 32 비트 설치에서 다릅니다.

희망이 도움이됩니다.


다중 아치라는 점에 감사드립니다. 나는 그것이 왜 작동을 멈췄는지 "왜"에 대한 해결책을 바라고 있었다.
Matt

2

나는 당신에게 유용 할 수있는 몇 가지 해결 방법 으로이 문제를 해결했습니다.

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

대신 만드는 그런 다음 crt?.o에 심볼릭 링크 /usr/lib가 전체 시스템에 영향을 미치는 경우, 당신은에 그 세 개의 파일을 심볼릭 링크 수 ${prefix}/lib/gcc/...에 대응하는 디렉토리 ${prefix}/bin해당 디렉토리에 gcc실행 파일이 설치됩니다. 즉, 거의 시작 파일에 대한 검색 경로의 상단에 실제로, 그래서 그것들을 찾을 수 있지만 다른 것에 영향을 미치지 않습니다.

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


1

우분투 정확한 x86_64에 GCC 4.1.2를 빌드했습니다. 당신이 한 것처럼, 나는 다음과 같이 grep-ped / 32 / 32 비트 c 런타임을 찾는 마지막 명령 "xgcc"의 strace를 살펴 보았다. 내 C 런타임은 / usr / lib32에 있으며 libc6-dev-i386 패키지에서 제공합니다.

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를 빌드했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.