Como parar o g ++ ligando / incluindo cabeçalhos / libs do sistema antigo de / usr / *?

3

O servidor em que quero executar algum código tem versões antigas do gcc (gmp, mpc, mpfr também) instaladas nos locais padrão, como /usr* , o administrador não quer atualizar, mas me permitiu instalar uma nova versão do gcc no meu diretório /home/username . Eu fiz isso e agora tenho g++d46 como gcc 4.6.3 instalado no meu diretório home /home/myusername/opt2/gcc-4.6.3 . Eu também tenho gmp, mpfr, mpc instalado em /home/myusername/tmp/gcc/{include,lib,share} .

Eu exportei {LD_LIBRARY_PATH, LIBRARY_PATH,LD_RUN_PATH}=/home/myusername/tmp2/gcc/lib:/home/myusername/opt2/gcc-4.6.3/lib/gcc/x86_64-unknown-linux-gnu/4.6.3:/home/myusername/opt2/gcc-4.6.3/lib64: e PATH=/bin:/usr/bin:/home/myusername/opt2/gcc-4.6.3/bin: também {C_INCLUDE_PATH,CPLUS_INCLUDE_PATH}=/home/myusername/tmp2/gcc/include:/home/myusername/opt2/gcc-4.6.3/include/c++/4.6.3:

Eu então compilo um código de teste com

g++d46 -g -O3 -I/home/myusername/tmp2/gcc/include -L/home/myusername
/tmp2/gcc/lib -Wall testMPFR3.cpp -o myBin -lgmp -lgmpxx -lmpfr

que compila e executa OK, mas ao fazer ldd myBin , vejo que, apesar de estarem principalmente vinculados às libs corretas em meu diretório home , também temos:

libm.so.6 => /lib64/libm.so.6 (0x0000003917e00000)
libc.so.6 => /lib64/libc.so.6 (0x0000003917a00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003917600000)

que não estão no meu diretório home, como é que ele sabe procurar em outro lugar, dado o env vars que eu exportei e meus -I e -L flags?

Além disso, se eu fizer g++ -H para ver de onde os cabeçalhos estão vindo, novamente a maioria (incluindo o novo gmp, mpfr felizmente) vem do meu diretório inicial, mas alguns:

..... /usr/include/sys/cdefs.h
...... /usr/include/bits/wordsize.h
..... /usr/include/gnu/stubs.h
...... /usr/include/bits/wordsize.h
...... /usr/include/gnu/stubs-64.h
........ /usr/include/stdio.h
........ /usr/include/bits/wchar.h
........ /usr/include/xlocale.h
....... /usr/include/locale.h
 ..... /usr/include/ctype.h
....... /usr/include/bits/types.h
........ /usr/include/bits/wordsize.h
........ /usr/include/bits/typesizes.h
....... /usr/include/endian.h
........ /usr/include/bits/endian.h
........ /usr/include/pthread.h
......... /usr/include/sched.h
.......... /usr/include/time.h
.......... /usr/include/bits/sched.h
......... /usr/include/time.h
.......... /usr/include/bits/time.h
......... /usr/include/signal.h
.......... /usr/include/bits/sigset.h
......... /usr/include/bits/pthreadtypes.h
.......... /usr/include/bits/wordsize.h
......... /usr/include/bits/setjmp.h
.......... /usr/include/bits/wordsize.h

Eu não entendo porque meu gcc-4.6.3 local está faltando isso? nem como o vinculador sabe reverter para /usr/* se não encontrá-los no diretório home?

Eu poderia usar a sinalização --nostdinc na compilação talvez, mas isso provavelmente não resolverá o problema de que os cabeçalhos acima não podem ser encontrados localmente por algum motivo.

    
por fpghost 03.12.2012 / 17:03

1 resposta

6

Os cabeçalhos que você mencionou, bem como /lib64/libc.so e /lib64/libm.so , pertencem à glibc (já que o posicionamento em /lib64 sugere que esses são arquivos de sistema principais (caso contrário, eles estariam em /usr/lib64 ). sua própria cópia dele, você pode vincular seus programas a ela, claro, mas a menos que isso seja realmente importante para você, tente não - basicamente todos os links contra libc, o que significa que você deve recompilar tudo (incluindo seu GCC e provavelmente qualquer coisa ) para ter certeza de que você não terá um binário, que se vincule à lib-xyz e à sua instalação glibc enquanto o lib-xyz usaria o glibc do sistema, o que poderia ter alguns efeitos colaterais desagradáveis.

Se você estiver interessado em construir um conjunto de ferramentas mais atualizado, certamente pode ser feito, ainda que para fazê-lo corretamente, você provavelmente deve dar uma olhada em Linux do zero e copie as partes que se aplicariam ao seu caso de uso.

Quanto ao funcionamento do vinculador dinâmico - verifique man ld.so (como sugeri na sua pergunta anterior). Para descobrir como o GCC pesquisa os cabeçalhos incluídos, provavelmente você vai querer ler sobre -I e --sysroot em man gcc .

    
por 03.12.2012 / 17:56

Tags