Tienda Wifi

Tienda Wifi
CiudadWireless es la tienda Wifi recomendada por elhacker.NET

Entradas Mensuales

Síguenos en:

Canal Oficial Telegram de elhacker.NET Grupo Facebook elhacker.NET Twitter elhacker.NET Canal Youtube elhacker.NET Comunidad Steam: Grupo elhacker.NET Mastodon

Entradas populares

PostHeaderIcon Gestión de librerías compartidas en GNU/Linux


Es habitual, si sois desarrolladores, que reutilicéis código fuente proporcionado por terceros. Normalmente /lib, /lib64, /usr/local/lib y otros directorios almacenan varias bibliotecas compartidas (o también llamadas librerías). Como administradores de sistemas necesitamos gestionar e instalar estas bibliotecas compartidas y para ello podremos usar estos comandos de gestión y depuración de problemas en GNU\Linux.



Las librerías compartidas en Linux, que son y como gestionarlas

¿Qué es una biblioteca en un sistema operativo GNU\Linux o UNIX "like"?
 
 Antes de empezar la explicación sobre las librerías compartidas creo que es conveniente definir bien lo que es una librería y los tipos de librerías que hay. Una librería es un fichero que contiene un conjunto de funciones, escritas en un lenguaje de programación, para ser utilizadas por un programa, de forma que si un programa necesita usar estas funcionalidades puede acceder a la librería sin tener que reescribir el código.  

La diferencia entre un programa y una librería es mínima, la única diferencia es que una librería no se ejecuta de forma autónoma ( no contiene el bloque de instrucción main ), pero por lo demás funciona como un programa normal ( también puede requerir de otras librerías para funcionar).

Una biblioteca no es más que una colección de recursos como subrutinas, funciones, clases, valores, etc... incluidos en un fichero. Así de simple. Existen dos clases de bibliotecas:

Tipos de librerías

Existen dos tipos de librerías, las librerías compartidas o dinámicas y las librerías estáticas. La diferencia entre ambas es que mientras en las librerías compartidas el acceso es dinámico y se realiza en tiempo de ejecución, en las estáticas las funcionalidades son enlazadas en tiempo de compilación y sustituidas por la llamada en el fichero ejecutable final.

  • Bibliotecas Estáticas: Son todos los ficheros con el siguiente formato de nombre y extensión lib*.a. Se incluyen dentro del ejecutable de la aplicación que las usa. Esto hace que el ejecutable sea de mayor tamaño que un ejecutable que usa bibliotecas dinámicas. Las bibliotecas se cargan en el programa en tiempo de compilación.
  • Bibliotecas Dinámicas: Son todos los ficheros con el siguiente formato de nombre y extensión lib*.so*. Estos ficheros no se incluyen dentro de los ejecutables de las aplicaciones y, por tanto, los ejecutables ocupan menos. A cambio, debemos disponer de los ficheros de biblioteca dinámica junto con el ejecutable para que este funcione. Los ejecutables cargan las bibliotecas en tiempo de ejecución usando ld.so o ld-linux.so. Como nota, en entornos Ms Windows, son las DLL.
Normalmente se usan las bibliotecas dinámicas para las aplicaciones actuales ya que permiten no duplicar código que se compilaría en cada aplicación que necesitara la misma biblioteca si estas fueran estáticas.



Las librerías compartidas

En este articulo vamos a tratar las librerías compartidas, y mas específicamente sobre las de Linux. En Linux ( y en Unix ) las librerías compartidas se llaman Shared Objects y llevan el sufijo .so ( su equivalente en Windows son las .dll ).

Como ya hemos mencionado, las librerías compartidas se vinculan a un programa en tiempo de ejecución, permitiendo que el código de la librería se cargue en memoria una única vez y pueda ser usado por varios programas, de esta forma se consigue que el tamaño del código sea menor con su correspondiente ahorro de espacio en memoria.

Ademas de esto con las librerías compartidas se cumple el principio de modularidad ( programación modular o orientada a objetos ), de forma que si necesitamos modificar alguna funcionalidad nos bastara con editar la librería que la contiene, dejando el programa que las utiliza sin modificar.

Los nombres de las librerías compartidas

Por convenio las librerías compartidas pueden tener varios tipos de nombre :
  • El nombre usado por el enlazador (‘lib’ + nombre de la libreria + ‘.so’)
  • Nombre completo (‘lib’ + nombre de la libreria + ‘.so’ + ‘.’ + numero de versión) // Link hacia la librería con el nombre real
  • Nombre real (‘lib’ + nombre de la libreria + ‘.so’ + ‘.’ + numero de versión + ‘.’ + numero de subversión + ‘.’ + revisión ) // La revisión es opcional

Para el cambio de versiones hay que tener dos factores en cuenta, el numero de la subversión se cambia cuando se realizan cambios en la librería y esta no pierde compatibilidad con la version anterior, pero si se pierde compatibilidad el cambio tiene que ser de versión y no de subversión. Gracias a este convenio de nombres es posible que múltiples versiones de una librería compartida coexistan en el sistema.


  • /lib : Librerías de sistema, vitales
  • /usr/lib : Librerías de usuario básicas, no se necesitan en el boot
  • /usr/local/lib : Librerías que no forman parte de la distribución estándar


Comandos de gestión de bibliotecas en GNU\Linux


  • ldconfig: crea los enlaces y caché necesarios a las bibliotecas compartidas más recientes que se encuentren en los directorios especificados en la línea de comandos, en el archivo /etc/ld.so.conf y en los directorios de confianza (/lib, /lib64 y /usr/lib). Usa el enlazador dinámico para ello.
  • ldd: Nos dice cuales son las bibliotecas que una aplicación necesita para funcionar.
  • ltrace: Es un trazador de llamadas a bibliotecas. Nos muestra datos de lo que hace un programa dado al ejecutarse y que bibliotecas usa en la ejecución. Sirve para depurar problemas (debug). Hay otros programas similares como strace.
  • ld.so/ld-linux.so: Es el enlazador dinámico.

Ficheros Importantes


Como administradores de sistemas debemos saber el propósito de ciertos ficheros relacionados con las bibliotecas dinámicas:


  • /lib/ld-linux.so.* : Enlazador/cargador en tiempo de ejecución.
  • /etc/ld.so.conf : Archivo que contiene una lista de directorios separados por dos puntos, espacios, tabuladores, nueva linea en los que se buscan las bibliotecas.
  • /etc/ld.so.cache : Archivo que contiene una lista ordenada de bibliotecas encontradas en los directorios especificados en /etc/ld.so.conf. Este fichero está en un formato no legible por humanos y no debe ser editado. Es creado por el comando ldconfig.
  • /etc/ld.so.preload : Archivo que contiene una lista, separada por espacios, de archivos de bibliotecas compartidas ELF que serán cargadas antes del programa. Bibliotecas y una lista ordenada de bibliotecas candidatas.
  • /etc/ld.so.nohwcap : Cuando este fichero está presente, el enlazador dinámico cargará la versión no optimizada de una biblioteca incluso si la CPU soporta la versión optimizada.
  • lib*.so.version : Bibliotecas compartidas almacenadas en los directorios /lib, /usr/lib, /usr/lib64, /lib64, /usr/local/lib. Por ejemplo, en Kubuntu, /usr/lib/libapt-pkg.so.4.10.1 es una biblioteca compartida relacionada con apt-pkg y su versión es la 4.10.1.

COMANDO ldconfig


Se necesita usar ldconfig para crear, actualizar y eliminar los enlaces y caché necesarios que usa el enlazador en tiempo de ejecución ld.so de las bibliotecas dinámicas más recientes encontradas en los directorios especificados en la linea de comandos, en el archivo /etc/ld.so.conf, y en los directorios de confianza /usr/lib, /lib64 y /lib.

El comando ldconfig chequea las cabeceras y nombres de los ficheros de las bibliotecas que encuentra cuando determina cual es la versión que deberían tener sus enlaces actualizados. Este comando también crea un archivo llamado /etc/ld.so.cache que se usa para acelerar el enlazado (linking)


Error While Loading Shared Libraries, Cannot Open Shared Object File



Can't find library xyz Error

El ejecutable requiere un enlace a la biblioteca dinámica que ld.so o ld-linux.so no puede encontrar. Esto significa que una biblioteca dinámica xyz es necesaria para el programa foo y no está instalada o la ruta (path) a ella no está establecida. Para arreglar este problema hay que instalar la biblioteca xyz y establecer la ruta en /etc/ld.so.conf o crear un archivo en el directorio /etc/ld.so.conf.d/ .

COMANDO ldd


ldd (List Dynamic Dependencies) es una aplicación UNIX y GNU\Linux para mostrar las bibliotecas compartidas que requiere un programa para funcionar. Esta herramienta se requiere para construir y ejecutar varios programas servidores en un entorno o jaula chroot.

Otros usos del comando ldd

Podemos usar ldd cuando un ejecutable está fallando debido a una dependencia perdida. Una vez que encuentras la dependencia perdida puedes instalarla o actualizar el cache con ldconfig como vimos antes.

Depuración (Debug) - Añadiendo nuevas librerías


Errores del tipo:


hello-world-program: error while loading shared libraries: libFoobar.so.1:
 cannot open shared object file: No such file or directory


 Ejemplos:

 ldd /usr/local/bin/weighttp
        linux-vdso.so.1 =>  (0x00007fff251ff000)
        libev.so.4 => not found
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f8f1cc1e000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f8f1c88b000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f8f1ce49000)

Buscar librería
 
libev.so.4
 
 
  find /usr -name "libev.so.4"
/usr/local/lib/libev.so.4


 Posibles soluciones (no recomendadas)

  • Instalar las librerías a /usr/lib en lugar de /local/lib/usr 
  • Hacer un link simbólico desde /usr/lib a los archivos de  /usr/local/lib
  • Copiar los archivos de /usr/local/lib a /usr/lib.

Soluciones recomendadas:

  • Establecer la variable de entorno LD_LIBRARY_PATH para que apunte a /usr/local/lib
 
setenv LD_LIBRARY_PATH /usr/local/lib

export LD_LIBRARY_PATH="/usr/local/lib"
O bien:
 
  • Editar el archivo /etc/ld.so.conf y añadir /usr/local/lib
    
    
    
    
 cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/lib
Y actualizar la caché:
sudo ldconfig 
 

sudo ldconfig -p

El enlazador dinámico ld.so

Ya hemos dicho que los ficheros binarios en Linux requieren un enlace dinámico ( a no ser que se opte por el enlace estático ), y de este enlace se encargan los programas ld.so y ld-linux.so*. La misión de estos dos es encontrar y cargar las bibliotecas compartidas requeridas por el programa en cuestión, preparar el programa para ejecutarse y ejecutarlo. Para ello el binario en cuestión ofrece el nombre de las bibliotecas que necesita y ld.so se encarga de buscarlas en las siguientes ubicaciones :

  • Las definidas a través de la variable de entorno LD_LIBRARY_PATH. Salvo cuando el ejecutable tiene activo el bit setuid/setgid, en cuyo caso se ignora.
  • Las definidas en el propio binario.
  • En el fichero /etc/ld.so.cache, que contiene una lista compilada de bibliotecas candidatas encontradas previamente en la ruta de bibliotecas ampliada.
  • En la ruta predeterminada /lib, y despues en /usr/lib/. Si el binario fue enlazado con la opción -znodeflib, se omite este paso.

La primera librería encontrada que cumpla la dependencia será la utilizada. Hay que tener en cuenta que lo que el binario contiene no es una lista con los enlaces a cada librería, sino una lista de rutas adicionales en las que buscar las dependencias ( si las tiene ).



Fuentes:
http://yoadminsis.blogspot.com.es/2011/01/gestion-de-bibliotecas-compartidas-y.html
http://ovtoaster.com/las-librerias-compartidas-en-linux-y-su-gestion/
https://lonesysadmin.net/2013/02/22/error-while-loading-shared-libraries-cannot-open-shared-object-file/

2 comentarios :

Unknown dijo...

un artículo muy bueno compañero , se agradece

Antuan dijo...

excelente artículo.
una duda. En caso de que la librería esté presente en varios directorios ¿cuál es la preferencia del sistema? ¿dónde buscará en primera instancia?
gracias mil : )

Publicar un comentario

Los comentarios pueden ser revisados en cualquier momento por los moderadores.

Serán publicados aquellos que cumplan las siguientes condiciones:
- Comentario acorde al contenido del post.
- Prohibido mensajes de tipo SPAM.
- Evite incluir links innecesarios en su comentario.
- Contenidos ofensivos, amenazas e insultos no serán permitidos.

Debe saber que los comentarios de los lectores no reflejan necesariamente la opinión del STAFF.