Como você constrói versões antigas do gcc? Erros sobre crti não sendo encontrados

8

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

Eu fiz um pouco de escavação e encontrei vários itens semelhantes, mas nenhum deles realmente resolveu o meu problema:

  • Eu verifiquei que todos os meus pacotes (libc6-dev e similares) foram reinstalados por esta questão
  • Eu verifiquei que 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 prefixar minha chamada de criação com trabalhos LIBRARY_PATH = / usr / lib / x86_64-linux-gnu, mas gostaria de evitar isso (se torna um ponto divergente em makefiles)
  • Eu tentei várias coisas com --with-build-sysroot, mas sem sucesso (leia: talvez eu simplesmente não saiba a bandeira certa para definir)
  • Ao executar com strace (conforme esta resposta ), posso veja a referência para crti.o:

    13240 open ("crti.o", O_RDONLY) = -1 ENOENT (Nenhum arquivo ou diretório)

Obrigado!

    
por Matt 03.11.2011 / 14:50

4 respostas

5

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

    
por Yoav 03.11.2011 / 22:03
9

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

Existem patches do GCC para corrigir aqui (final ainda não aprovado versões, mas corretos para o Ubuntu), e eles 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 temporários é uma boa correção:

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

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

Espero que ajude.

    
por ams 14.11.2011 / 12:12
2

Eu 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 bootstrap da build saiba onde encontrar os arquivos crt?.o start.

Então, em vez de fazer crt?.o links simbólicos em /usr/lib onde eles afetam todo o seu sistema, você pode ligar esses três arquivos no diretório ${prefix}/lib/gcc/... correspondente ao diretório ${prefix}/bin que o executável gcc está instalado Na verdade, isso está quase no topo de seu caminho de busca para os arquivos de inicialização, então ele os encontrará - 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á tem outros arquivos como crtbegin.o .

    
por Brooks Moses 19.07.2012 / 08:27
1

Eu criei o GCC 4.1.2 no Ubuntu x86_64. Como você fez, dei uma olhada no strace do último comando "xgcc" procurando por 32bit c runtime, grep-ped / 32 / da seguinte maneira. O tempo de execução do c está no / 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, eu 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 

Eu criei com sucesso o GCC 4.1.2.

    
por Naoyuki Tai 13.03.2013 / 22:22

Tags