Tengo un ejecutable binario llamado "alfa" que requiere una biblioteca vinculada (libz.so.1.2.7) que se coloca en /home/username/myproduct/lib/libz.so.1.2.7
Exporte lo mismo a mi instancia de terminal antes de generar mi ejecutable binario ejecutando el siguiente comando.
export LD_LIBRARY_PATH=/home/username/myproduct/lib/:$LD_LIBRARY_PATH
Ahora, cuando engendro otra aplicación "bravo" que requiere la misma biblioteca pero de diferente versión, es decir (libz.so.1.2.8) que está disponible
/lib/x86_64-linux-gnu/libz.so.1.2.8
, el sistema arroja el siguiente error.
version `ZLIB_1.2.3.3' not found (required by /usr/lib/x86_64-linux-gnu/libxml2.so.2)
Si desarmado LD_LIBRARY_PATH
, "bravo" comienza bien. Entiendo que el comportamiento anterior se debe a que LD_LIBRARY_PATH
tiene prioridad sobre las rutas de directorio definidas /etc/ld.so.conf
al buscar bibliotecas vinculadas y, en consecuencia, se produjo el error anterior. Tengo curiosidad por saber por qué los desarrolladores de UNIX / LINUX no han diseñado el sistema operativo para buscar bibliotecas vinculadas en otros directorios según la jerarquía si la primera instancia de la biblioteca es de una versión diferente.
En pocas palabras, los sistemas UNIX / LINUX atraviesan un conjunto de directorios hasta encontrar la biblioteca requerida. Pero, ¿por qué no hace lo mismo hasta que encuentra la versión esperada en lugar de aceptar la primera instancia de la biblioteca, independientemente de su versión?
fuente
libz.so.1
es un enlace simbólico alibz.so.1.2.8
Respuestas:
Lo hace, por lo que sabe.
zlib.so.1.2.7
yzlib.so.1.2.8
ambos tienen un soname dezlib.so.1
, así que tualpha
y losbravo
binarios dicen que necesitanzlib.so.1
. El cargador dinámico carga la primera biblioteca coincidente que encuentra; no sabe que la versión 1.2.8 proporciona símbolos adicionales quebravo
necesita. (Esta es la razón por la cual las distribuciones se esfuerzan para especificar información de dependencia adicional, comozlib1g (>= 1.2.8)
por ejemplobravo
).Puede pensar que esto debería ser fácil de solucionar, pero no lo es, sobre todo porque los archivos binarios y las bibliotecas enumeran los símbolos que necesitan por separado de las bibliotecas que necesitan, por lo que el cargador no puede verificar que una biblioteca determinada proporcione todos los símbolos que son necesarios de ella. Los símbolos se pueden proporcionar de varias maneras, y la introducción de un enlace entre los símbolos y las bibliotecas que los proporcionan podría romper los archivos binarios existentes. También existe la diversión añadida de la interposición de símbolos para complicar las cosas (y hacer que los desarrolladores sensibles a la seguridad se rompan el pelo).
Algunas bibliotecas proporcionan información de la versión que termina siendo almacenada
.gnu.version_r
, con un enlace a la biblioteca proveedora, que ayudaría aquí, perolibz
no es una de ellas.(Teniendo en cuenta los sonames, espero que su
alpha
binario funcione bienzlib.so.1.2.8
).fuente
zlib
no se usa delibtool
todos modos, excepto en Darwin donde estáar
;-).