<Anterior | Contenido | Siguiente>
6.10. Ajuste de la cadena de herramientas
Ahora que se han instalado las bibliotecas C finales, es hora de ajustar la cadena de herramientas para que vincule cualquier programa recién compilado con estas nuevas bibliotecas.
/ tools / bin / {ld, ld-old}
/ tools / $ (uname -m) -pc-linux-gnu / bin / {ld, ld-old}
/ tools / bin / {ld-new, ld}
/ tools / bin / {ld, ld-old}
/ tools / $ (uname -m) -pc-linux-gnu / bin / {ld, ld-old}
/ tools / bin / {ld-new, ld}
Primero, haga una copia de seguridad del /instrumentos enlazador y lo reemplazamos con el enlazador ajustado que hicimos en el capítulo 5. También crearemos un enlace a su contraparte en / herramientas / $ (uname -m) -pc-linux-gnu / bin:
mv mv mv
ln
-v
-v
-v
mv mv mv
ln
-sv / herramientas / bin / ld / herramientas / $ (uname -m) -pc-linux-gnu / bin / ld
-sv / herramientas / bin / ld / herramientas / $ (uname -m) -pc-linux-gnu / bin / ld
A continuación, modifique el archivo de especificaciones GCC para que apunte al nuevo vinculador dinámico. Simplemente eliminar todas las instancias de "/ tools" debería dejarnos con la ruta correcta al enlazador dinámico. También ajuste el archivo de especificaciones para que GCC sepa dónde encontrar los encabezados correctos y los archivos de inicio de Glibc. A SED comando logra esto:
gcc -dumpspecs | sed -e 's @ / tools @@ g' \
-e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \
-e '/ \ * cpp: / {n; s @ $ @ -isystem / usr / include @}'> \
`dirname $ (gcc --print-libgcc-file-name)` / specs
gcc -dumpspecs | sed -e 's @ / tools @@ g' \
-e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \
-e '/ \ * cpp: / {n; s @ $ @ -isystem / usr / include @}'> \
`dirname $ (gcc --print-libgcc-file-name)` / specs
Es una buena idea inspeccionar visualmente el archivo de especificaciones para verificar que se realizó el cambio deseado.
Es imperativo en este punto asegurarse de que las funciones básicas (compilación y vinculación) de la cadena de herramientas ajustada estén funcionando como se espera. Para hacer esto, realice las siguientes comprobaciones de cordura:
echo 'int main () {}'> dummy.c
cc dummy.c -v -Wl, - detallado &> dummy.log readelf -l a.out | grep ': / lib'
echo 'int main () {}'> dummy.c
cc dummy.c -v -Wl, - detallado &> dummy.log readelf -l a.out | grep ': / lib'
No debería haber errores, y el resultado del último comando será (permitiendo diferencias específicas de la plataforma en el nombre del enlazador dinámico):
[Solicita el intérprete del programa: /lib64/ld-linux-x86-64.so.2]
[Solicita el intérprete del programa: /lib64/ld-linux-x86-64.so.2]
Tenga en cuenta que en sistemas de 64 bits / lib es la ubicación de nuestro enlazador dinámico, pero se accede a través de un enlace simbólico en / lib64.
Note
En sistemas de 32 bits, el intérprete debe ser /lib/ld-linux.so.2.
Note
En sistemas de 32 bits, el intérprete debe ser /lib/ld-linux.so.2.
Ahora asegúrese de que estemos configurados para usar los archivos de inicio correctos:
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
La salida del último comando debería ser:
/usr/lib/../lib/crt1.o tuvo éxito
/usr/lib/../lib/crti.o tuvo éxito
/usr/lib/../lib/crtn.o tuvo éxito
/usr/lib/../lib/crt1.o tuvo éxito
/usr/lib/../lib/crti.o tuvo éxito
/usr/lib/../lib/crtn.o tuvo éxito
Verifique que el compilador esté buscando los archivos de encabezado correctos:
grep -B1 '^ / usr / include' dummy.log
grep -B1 '^ / usr / include' dummy.log
Este comando debería devolver el siguiente resultado:
#include <...> la búsqueda comienza aquí:
/ usr / include
#include <...> la búsqueda comienza aquí:
/ usr / include
A continuación, verifique que el nuevo vinculador se esté utilizando con las rutas de búsqueda correctas:
grep 'SEARCH. * / usr / lib' dummy.log | sed 's |; | \ n | g '
grep 'SEARCH. * / usr / lib' dummy.log | sed 's |; | \ n | g '
Las referencias a rutas que tienen componentes con '-linux-gnu' deben ignorarse, pero de lo contrario, la salida del último comando debe ser:
SEARCH_DIR ("/ usr / lib") SEARCH_DIR ("/ lib")
SEARCH_DIR ("/ usr / lib") SEARCH_DIR ("/ lib")
A continuación, asegúrese de que estamos usando la libc correcta:
grep "/lib.*/libc.so.6" dummy.log
grep "/lib.*/libc.so.6" dummy.log
La salida del último comando debería ser:
intento de abrir /lib/libc.so.6 exitoso
intento de abrir /lib/libc.so.6 exitoso
Por último, asegúrese de que GCC esté utilizando el vinculador dinámico correcto:
grep encontrado dummy.log
grep encontrado dummy.log
La salida del último comando debe ser (teniendo en cuenta las diferencias específicas de la plataforma en el nombre del enlazador dinámico):
encontrado ld-linux-x86-64.so.2 en /lib/ld-linux-x86-64.so.2
encontrado ld-linux-x86-64.so.2 en /lib/ld-linux-x86-64.so.2
Si la salida no aparece como se muestra arriba o no se recibe en absoluto, entonces algo está muy mal. Investigue y vuelva sobre los pasos para averiguar dónde está el problema y corregirlo. La razón más probable es que algo salió mal con el ajuste del archivo de especificaciones. Cualquier problema deberá resolverse antes de continuar con el proceso.
Una vez que todo funcione correctamente, limpie los archivos de prueba:
rm -v dummy.c a.out dummy.log
rm -v dummy.c a.out dummy.log