2.7.1.- Localizar ficheros de bibliotecas

biblioteca-alternativa.pngEl principal reto administrativo de la gestión de las bibliotecas compartidas está relacionado con hacer que los programas puedan localizarlos. Los ficheros de programas binarios pueden hacer referencia a las bibliotecas a través de su nombre aislado (como en libc.so.6) o proporcionando una ruta completa (como en /lib/libc.so.6). en el primer caso, debe configurar una ruta de biblioteca (un conjunto de directorios en los que los programas buscarán las bibliotecas). Esto se puede hacer tanto a través de un fichero de configuración global como mediante una variable de entorno. Si una ruta estática a una biblioteca es errónea, debe encontrar un modo de corregir el problema. En todos estos casos, tras realizar un cambio, puede que tenga que utilizar un comando especial para hacer que el sistema reconozca el cambio, como describiremos más adelante.

Definir la ruta para todo el sistema

El primero de los modos de definir la ruta de las bibliotecas es editar el fichero /etc/ld.so.conf. Éste consiste en una serie de líneas, en la que cada una de éstas lista un directorio en el que se pueden encontrar ficheros de bibliotecas compartidas. Normalmente, este fichero lista entre 6 y 24 directorios. Algunas distribuciones poseen un tipo de línea adicional en este fichero. Estas líneas comienzan con la directiva include; listan los ficheros que se van a incluir como si fueran parte del fichero final. Por ejemplo, el fichero ld.so.conf de Ubuntu  y Fedora 19 comienzan con esta línea:

include /etc/ld.so.conf.d/*.conf

Esta línea le indica al sistema que cargue todos los ficheros de /etc/ld.so.conf cuyos nombres terminan en .conf como si fueran parte del fichero /etc/ld.so.conf principal. Este mecanismo permiten a los mantenedores de paquetes añadir sus directorios de bibliotecas únicos a la lista de búsqueda colocando un fichero .conf en el directorio apropiado.

Algunas distribuciones, como Gentoo, utilizan un mecanismo con un objetivo similar pero detalles diferentes. Con estas distribuciones, la utilidad env-update lee los ficheros de /etc/env.d para crear la forma final de varios ficheros de configuración /etc, incluyendo /etc/ld.so.conf. En concreto, se leen las variables LDPATH de estos ficheros y sus valores conforman las líneas de ld.so.conf.

Por lo tanto, para cambiar ld.so.conf en Gentoo u otras distribuciones que utilicen este mecanismo, debería añadir o editar los ficheros /etc/env.d y después escribir env-update para hacer la tarea.

En términos generales, rara vez hay necesidad de cambiar la ruta de las bibliotecas para todo el sistema. Los ficheros de paquetes de bibliotecas suelen instalarse a si mismos en directorios que ya se encuentran en la ruta o añadir sus rutas automáticamente. La principal razón para realizar tales cambios sería que se instalara un paquete de biblioteca o un programa que creara saus propias bibliotecas, en una ubicación inusual a través de un mecanismo diferente a la utilidad del paquete principal de su distribución. Por ejemplo, podría compilar una biblioteca desde el código fuente y después tener que actualizar su ruta de esta manera.

Tras cambiar la ruta de su biblioteca, debe utilizar ldconfig para que sus programas utilicen la nueva, como comentaremos más adelante.

NOTA: Además de los directorios especificados en /etc/ld.so.conf, Linux hace referencia a los directorios de biblioteca habituales, /lib y /usr/lib. Estos directorios siempre están en la ruta de las bibliotecas, aunque aparezca en ld.so.conf.

Nueva Línea
Cambiar la ruta temporalmente

A veces, no es necesario cambiar la ruta de manera permanente y global e, incluso, puede ser inapropiado. Por ejemplo, puede que desee comprobar el efecto de una nueva biblioteca antes de utilizarla para todos los programas. Para ello, podría instalar las bibliotecas compartidas en una ubicación poco usual y luego definir la variable de entorno LD_LIBRARY_PATH, que especifica los directorios adicionales en los que el sistema buscará las bibliotecas.

NOTA: En próximo capítulo describiremos con más detalle las variables de entorno.

Otradddda
Para
definir la variable de entorno LD_LIBRARY_PATH empleando la consola bash, puede escribir un comando como éste:

$ export LD_LIBRARY_PATH=/usr/local/testlib:/opt/newlib

Esta línea añade dos directorios a la ruta de búsquesa, /usr/local/testlib y /opt/newlib. Puede especificar pocos o muchos directorios si lo desea, separados por dos puntos. Éstos se añadirán al inicio de la ruta, lo que significa que tendrán preferencia frente a otros directorios. Este hecho resulta útil cuando se prueban bibliotecas de sustitución, pero puede provocar problemas si los usuarios definen estas variables de entorno de manera inapropiada.

Puede definirla de manera permanente en los ficheros de script de inicio de consola de un usuario. Si lo hace, ello implicará que el usuario siempre utilizará las rutas de bibliotecas especificadas, además, de las rutas normales del sistema. En principio, se puede definir LD_LIBRARY_PATH globalmente, pero el método efectivo de efectuar cambios globales en la ruta de las bibliotecas es emplear /etc/ld.so.conf.

A diferencia de otros cambios en las rutas de las bibliotecas, éste no requiere que ejecute ldconfig para que tenga efecto.

Corregir problemas

Los problemas de las rutas de biblioteca suelen manifestarse como una incapacidad del sistema para localizar una biblioteca. Si inicia el programa desde una consola, verá un mensaje de error como éste:

$ gimp
gimp: error while loading shared libraries: libXinerama.so.l: cannot open shared object file: No such file or directory

Este mensaje indica que el sistema no puede localizar el fichero de biblioteca libXinerama.so.l. La causa habitual de tales problemas es que la biblioteca no está instalada, por lo que debería revisar esto utilizando comandos como find. Si el fichero no está instalado, pruebe a seguir la pista al paquete al que debería pertenecer (una búsqueda en la web puede solucionarlo) e instalarlo.

Si, por otra parte, el fichero de la biblioteca sí está disponible, puede que necesite añadir globalmente su directorio o hacerlo en LD_LIBRARY_PATH. A veces, la ruta de la biblioteca está indicada explícitamente en el fichero binario del programa (esto se puede averiguar utilizando ldd, que describimos brevemente en la siguiente sección). Cuando le ocurra esto, puede que tenga que crear un enlace simbólico desde la ubicación de la biblioteca en su sistema a la ubicación que espera el programa. Puede encontrarse con un problema similar cuando el programa espera que la biblioteca tenga un nombre pero en su sistema recibe otro. Por ejemplo, puede que el programa haga referencia a biglib.so.5 y que su sistema tenga instalado biglib.so.5.2. Los cambios en los números de versión menores como éste no suele tener consecuencias, por lo que el problema se resuelve creando un enlace simbólico:

# ln -s biglib.so.5.2 biglib.so.5

Debe escribir este comando como root desde desde el directorio en el que se encuentra la biblioteca. Después, tendrá que ejecutar ldconfig, como como se describe en la siguiente sección.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s