Problema ao compilar o GCC moderno com glibc antigo

4

Estou tentando obter um GCC moderno para compilar no Centos 6.4. O problema é que o Centos não tem um glibc moderno e o GCC 4.8.xe 4.7.x continua me dando o seguinte erro de compilação:

... -DL_gcov -c ../../.././libgcc/libgcov.c
In file included from /usr/include/features.h:385:0,
                 from /usr/include/stdio.h:28,
                 from ../../.././libgcc/../gcc/tsystem.h:88,
                 from ../../.././libgcc/libgcov.c:29:
/usr/include/gnu/stubs.h:7:27: fatal error: gnu/stubs-32.h: No such file or directory

O problema aqui é que o gnu/stubs-32.h é parte do moderno glibc e o Centos 6.4 não parece tê-lo. Eu tentei construir meu próprio glibc mas assim que ele é instalado e no meu local LD_LIBRARY_PATH eu não posso rodar nenhum outro programa, porque todos os executáveis existentes no sistema tentam se conectar a ele e eles falham .

Eu quero usar o novo compilador porque ele tem um tratamento drasticamente melhor do código STL do C ++, e porque o otimizador do GCC 4.8 faz meu código ser executado na metade do tempo como o compilador do GCC 4.4.7 que vem com o Centos.

Alguma sugestão sobre como fazer isso?

    
por vy32 16.07.2013 / 14:06

3 respostas

2

Compile o compilador gcc no seu Centos e segmente apenas 64 bits.
Excerto da documentação :

C standard library and headers In order to build GCC, the C standard library and headers must be present for all target variants for which target libraries will be built (and not only the variant of the host C++ compiler). This affects the popular ‘x86_64-unknown-linux-gnu’ platform (among other multilib targets), for which 64-bit (‘x86_64’) and 32-bit (‘i386’) libc headers are usually packaged separately. If you do a build of a native compiler on ‘x86_64-unknown-linux-gnu’, make sure you either have the 32-bit libc developer package properly installed (the exact name of the package depends on your distro) or you must build GCC as a 64-bit only compiler by configuring with the option --disable-multilib. Otherwise, you may encounter an error such as ‘fatal error: gnu/stubs-32.h: No such file’

    
por 23.09.2015 / 18:35
3

Ah, bem-vindo à diversão de bibliotecas super desatualizadas. Eu me deparei com problemas semelhantes, e nossa solução foi compilar uma segunda versão do GLIBC e usá-la explicitamente ao iniciar o software.

Eu só tive que fazer isso no CentOS 5, então você pode ser capaz de sair com versões superiores do software, então eu mencionei.

Você precisará criar o GLIBC assim:

CFLAGS='-march=i686 -O2' ../configure --prefix=/home/glibc215 \
  make -j 4 && make install

(Eu estava usando o GLIBC 2.15, comandos semelhantes devem funcionar com versões mais recentes)

Depois de criar, execute manualmente seu aplicativo com algo assim:

/home/glibc215/lib/ld-linux.so.2 --library-path /home/glibc215/lib/:. /bin/bash

As coisas ficarão ainda mais complicadas pelo fato de você precisar de uma versão moderna do GCC. Eu não tenho uma solução decente para você, você vai precisar brincar com a execução de coisas com a versão alternativa do glibc, a fim de obter o seu novo gcc para construir corretamente.

    
por 17.07.2013 / 04:45
0

Você pode instalar um glibc mais recente em ~/lib e instalar o gcc em ~/bin e vincular-se ao glibc mais recente. Eu aconselho usar isso apenas para seu aplicativo que roda no supercomputador e para vincular tudo (incluindo libc) estaticamente para evitar fazer uma bagunça maior do que você terá que fazer para isso.

Não é uma solução particularmente elegante / elegante, mas pode fazer o trabalho. Eu fiz algo parecido anos atrás, quando me envolvi com o ld.so e não queria estragar todo o sistema: -)

    
por 17.07.2013 / 00:03