2011-10-09 6 views
11

¿Está su ubicación codificada en código gcc o simplemente gcc llama al as y debemos tener la ubicación as en nuestra variable PATH?¿Cómo encuentra gcc as, ld y otros ejecutables binutils?

Y en este último caso, ¿cómo podríamos crear dos cadenas de herramientas gcc completamente separadas? Quiero decir, ¿cómo podemos hacer que gcc-A invoque as-A y gcc-B invoque as-B si as-A y as-B se llaman as?

Respuesta

10

Algunas de las rutas (por ejemplo, a cc1) están compiladas en. Otros (por ejemplo, as) usan la búsqueda normal en $ PATH. Esto puede variar según las opciones con las que GCC esté configurado.

Puede ver bastante fácilmente ejecutando con strace, y grepping para exec|stat.

$ strace -f gcc foo.c -o foo |& grep exec 
⋮ 
[pid 24943] execve("/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.6.1/cc1", … 

Esa es una llamada a CC1 por un camino en el programa compilado, como se puede ver en la falta de en busca de ella. Tampoco está en $ PATH.

[pid 24944] execve("/home/anthony/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = -1 ENOENT (No such file or directory) 
[pid 24944] execve("/usr/local/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = -1 ENOENT (No such file or directory) 
[pid 24944] execve("/usr/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = 0 

Eso está buscando as en $ PATH. Puede ver porque está probando cada ubicación en $ PATH en orden.

He omitido una gran producción, incluso con solo stat y exec, es de varias páginas.

Al ejecutar gcc -v, se mostrarán algunas de las rutas de acceso compiladas (como parte de la línea de configuración).

+0

Muchas gracias. ¿Sabes qué opciones de configuración definen el comportamiento final? ¿Hay alguna forma de limitar el uso de gcc gcc/my/path/as y my/path/ld? –

+1

@MichalisVichos: Probablemente el indicador de configuración '--with-as =/my/path/as' haría eso. Parece que la documentación de configuración está disponible en http://gcc.gnu.org/install/configure.html (o, por supuesto, con './configure --help') – derobert

1

Hay una opción ad-hoc para que: -B * * prefijo, citando documentos gcc:

Para cada subprograma que se ejecute, el conductor compilador intenta primero el prefijo -B, si los hubiere. Si ese nombre no se encuentra, o si no se especificó -B, el controlador prueba dos prefijos estándar, que son/usr/lib/gcc/y/usr/local/lib/gcc /. [...]

1

También puede consultar la ruta de búsqueda de GCC con:

gcc -print-search-dirs | grep -E '^programs' | tr ':' '\n' 

resultado de ejemplo:

programs 
=/usr/lib/gcc/x86_64-linux-gnu/6/ 
/usr/lib/gcc/x86_64-linux-gnu/6/ 
/usr/lib/gcc/x86_64-linux-gnu/ 
/usr/lib/gcc/x86_64-linux-gnu/6/ 
/usr/lib/gcc/x86_64-linux-gnu/ 
/usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/6/ 
/usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/ 
/usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/ 

y un programa específico con:

gcc -print-prog-name=cc1 

muestra de salida:

/usr/lib/gcc/x86_64-linux-gnu/6/cc1 
Cuestiones relacionadas