Como você cria versões mais antigas do gcc? Erros sobre o crti.o não sendo encontrados

10

Como criar um gcc mais antigo (especificamente 4.5.2) no Ubuntu 11.10 e evitar erros sobre "/ usr / bin / ld: não consigo encontrar crti.o: não existe esse arquivo ou diretório"?

Pesquisei um pouco e encontrei vários itens semelhantes, mas nenhum que realmente resolva meu problema:

  • Eu verifiquei que todos os meus pacotes (libc6-dev e similares) são reinstalados por esta pergunta
  • Eu verifiquei que o crti.o existe em / usr / lib32 e / usr / lib / x86_64-linux-gnu, e que meu ld.so.conf está configurado para procurar nesses diretórios
  • Eu verifiquei que antes de fazer minha chamada de make com LIBRARY_PATH = / usr / lib / x86_64-linux-gnu funciona, mas gostaria de evitar isso (ele se torna um ponto divergente nos makefiles)
  • Eu tentei várias coisas com --with-build-sysroot, mas sem sucesso (leia-se: talvez eu simplesmente não saiba o sinalizador certo para definir)
  • Ao executar com strace (conforme esta resposta ), posso ver a referência simples a crti.o:

    13240 open ("crti.o", O_RDONLY) = -1 ENOENT (Esse arquivo ou diretório não existe)

Obrigado!

Matt
fonte

Respostas:

7

Eu tive o mesmo problema. Fazer links simbólicos /usr/libs/crt?.o para /usr/lib/x86_64-linux-gnu/crt?.oresolver o problema para mim.

Yoav
fonte
Isso funciona, sim. Eu estava esperando por uma solução que era mais ao longo das linhas de ajustes a instalação gcc ao invés de mucking com estruturas de arquivos subjacentes, embora ...
Matt
Eu queria acrescentar que, no meu caso, recompilei o glibc e o GCC, mas esqueci de me livrar de uma versão mais antiga do slackware-gcc que estava em / usr / bin /. Quando removi o último, pude compilar certas coisas novamente (como o gcc novamente).
shevy
10

Mesmo versões muito novas do GCC falham com essa mensagem. É porque as novas versões do Debian / Ubuntu suportam multiarch (ou seja, instalar binários para várias máquinas em um sistema de arquivos), então as bibliotecas foram removidas dos locais padrão.

Existem correções do GCC para corrigi-lo aqui (versões finais ainda não aprovadas, mas corretas para o Ubuntu), e provavelmente se aplicam ao GCC mais antigo sem muito esforço, talvez. Eu acho que você precisa configurar o GCC com --enable-multiarch , ou algo assim.

Enquanto isso, a criação de links flexíveis é uma boa solução:

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

(o nome da pasta será diferente nas instalações de 32 bits).

Espero que ajude.

ams
fonte
Obrigado pelo argumento de que é multiarca. Eu estava esperando uma resolução sobre "por que" parou de funcionar.
Matt
2

Resolvi esse problema com algumas soluções alternativas que podem ser úteis para você.

Primeiro, crie o GCC com LIBRARY_PATH=/usr/lib/x86_64-linux-gnu, para que o processo de inicialização do build saiba onde encontrar os crt?.oarquivos de início.

Então, em vez de criar crt?.olinks simbólicos nos locais /usr/libem que afetam todo o sistema, você pode vincular esses três arquivos no ${prefix}/lib/gcc/...diretório correspondente ao ${prefix}/bindiretório em que o gccexecutável está instalado. irá encontrá-los - mas eles não afetam mais nada.

No meu caso, o diretório específico para colocá-los era lib/gcc/x86_64-unknown-linux-gnu/4.3.2/; você pode encontrar o caminho certo, porque ele já possui outros arquivos crtbegin.o.

Brooks Moses
fonte
1

Eu construí o GCC 4.1.2 no Ubuntu x86_64 preciso. Como você fez, dei uma olhada no rastro do último comando "xgcc" procurando pelo tempo de execução de 32 bits c, grep-ped / 32 / da seguinte maneira. O tempo de execução C no meu está em / usr / lib32, que é fornecido pelo pacote 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)

Então, criei os links simbólicos crt? .O no diretório xgcc procurado.

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 

Criei com êxito o GCC 4.1.2.

Naoyuki Tai
fonte