Estaciones de trabajo en línea OnWorks Linux y Windows

Logotipo

Alojamiento gratuito en línea para estaciones de trabajo

<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.

imagen

/ 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]


imagen

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


Top OS Cloud Computing en OnWorks: