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

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

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

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

  • Eu verifiquei que todos os meus pacotes (libc6-dev e similares) foram reinstalados poressa questão
  • 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 preceder minha invocação de make com LIBRARY_PATH=/usr/lib/x86_64-linux-gnu funciona, mas gostaria de evitar isso (torna-se um ponto divergente em makefiles)
  • Eu tentei várias coisas com --with-build-sysroot, mas sem sucesso (leia: talvez eu simplesmente não saiba o sinalizador certo para definir)
  • Ao executar com strace (conformeesta 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!

Responder1

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

Existem patches do GCC para consertar issoaqui(versões finais ainda não aprovadas, mas corretas para Ubuntu), e provavelmente se aplicam ao GCC mais antigo sem muito esforço, talvez. Eu acho que você precisa configurar o GCC com--enable-multiarca, ou alguma coisa.

Enquanto isso, criar links virtuais é 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.

Responder2

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

Responder3

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

Primeiro, construa o GCC com LIBRARY_PATH=/usr/lib/x86_64-linux-gnu, para que o processo de inicialização da construção saiba onde encontrar os crt?.oarquivos iniciais.

Então, em vez de criar crt?.olinks simbólicos /usr/libonde eles afetam todo o seu sistema, você pode vincular esses três arquivos ao ${prefix}/lib/gcc/...diretório correspondente ao ${prefix}/bindiretório em que o gccexecutável está instalado. Na verdade, isso está quase no topo do caminho de pesquisa para os arquivos iniciais, então ele os encontrará – mas eles não afetarão 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á contém outros arquivos semelhantes crtbegin.o.

Responder4

Eu construí o GCC 4.1.2 no Ubuntu x86_64 preciso. Como você fez, dei uma olhada no strace do último comando "xgcc" procurando por tempo de execução c de 32 bits, grep-ped /32/ como segue. 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 que o xgcc procurou.

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 construí com sucesso o GCC 4.1.2 com ele.

informação relacionada