2 votos

Relación entre el binario y su archivo de dependencia dylib

Con mi entendimiento, si un binario (por ejemplo, rsync) hace referencia (depende de) una biblioteca estática (libxxx.a) y la libxxx.a se actualiza, el binario debe ser recompilado para reflejar la actualización de libxxx.a. ¿Es correcto?

Y luego, ¿qué pasa si un binario hace referencia (depende de) una biblioteca dinámica (libxxx.dylib)? ¿Debería ser recompilado también?

La razón por la que pregunto esto es que otool -L rsync devuelve la versión antigua de libxxhash.0.dylib incluso aunque actualicé xxhash de 0.8.1 a 0.8.2

roushi@roushinoMacBook-Air lib % ls -l libxxhash.*
-rwxr-xr-x  1 root  wheel  53256 10 28 21:12     libxxhash.0.8.2.dylib
lrwxr-xr-x  1 root  wheel     21 10 28 21:12 libxxhash.0.dylib -> libxxhash.0.8.2.dylib
-rw-r--r--  1 root  wheel  43096 10 28 21:12 libxxhash.a
lrwxr-xr-x  1 root  wheel     21 10 28 21:12 libxxhash.dylib -> libxxhash.0.8.2.dylib
roushi@roushinoMacBook-Air lib % file libxxhash.a
libxxhash.a: current ar archive random library
roushi@roushinoMacBook-Air lib % otool -L `which rsync`
/usr/local/bin/rsync:
    /usr/lib/libz.1.dylib (versión de compatibilidad 1.0.0, versión actual 1.2.11)
    /usr/local/lib/libpopt.0.dylib (versión de compatibilidad 1.0.0, versión actual 1.2.0)
    /usr/lib/libiconv.2.dylib (versión de compatibilidad 7.0.0, versión actual 7.0.0)
    /usr/local/lib/liblz4.1.dylib (versión de compatibilidad 1.0.0, versión actual 1.9.4)
    /usr/local/lib/libzstd.1.dylib (versión de compatibilidad 1.0.0, versión actual 1.5.5)
    /usr/local/lib/libxxhash.0.dylib (versión de compatibilidad 0.0.0, versión actual 0.8.1)
    /usr/local/lib/libcrypto.1.1.dylib (versión de compatibilidad 1.1.0, versión actual 1.1.0)
    /usr/lib/libSystem.B.dylib (versión de compatibilidad 1.0.0, versión actual 1319.100.3)
    /usr/lib/libcharset.1.dylib (versión de compatibilidad 2.0.0, versión actual 2.0.0)

Como quizás sepa, no estoy usando Homebrew...

0voto

xanadu6291 Puntos 163

Se me ocurrió ejecutar otool con la opción -l, es decir otool -l /usr/local/bin/rsync | grep -3 xxhash. Este comando devolvió lo siguiente:

Load command 19
          cmd LC_LOAD_DYLIB
      cmdsize 64
         name /usr/local/lib/libxxhash.0.dylib (offset 24)
   time stamp 2 Thu Jan  1 09:00:02 1970
      current version 0.8.1
compatibility version 0.0.0

Este resultado significa que otool lee la información interna de rsync. No lee la información interna del dylib. Y además, rsync carga el dylib por nombre. No por la versión del dylib.

La información interna de rsync está fija en tiempo de compilación, por lo que podría mostrar una versión antigua. Pero el verdadero dylib que se carga es el último.

Hice un experimento para probar mis pensamientos anteriores. Que es mover a la papelera el archivo llamado libxxhash.0.dylib que está ubicado en /usr/local/lib.

Aunque el archivo esté desaparecido, otool muestra la versión del dylib. Pero, rsync no puede ejecutarse con el error Library not loaded.

Por lo tanto, la versión del dylib de otool no debería importar. El binario dependiente carga el dylib más reciente. No es necesario recompilar el binario con la actualización del dylib correspondiente.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X