Cambiar la biblioteca vinculada para un ejecutable dado (CentOs 6)

29

Tengo un ejecutable vinculado de esta manera:

  $ ldd a.out
        libboost_system-mt.so.1.47.0 => /usr/lib64/libboost_system-mt.so.1.47.0 (0x00007f4881f56000)
        libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f4881cfb000)
        libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f4881965000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f488175d000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4881540000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f4881239000)
.
.

Donde las bibliotecas libcrypto y libssl son openssl 1.0.0-fips libs. En cambio, quiero experimentar con las bibliotecas 1.0.1, por lo que las he creado en mi directorio de inicio. ¿Hay alguna manera de volver a.outa vincular contra mis nuevas bibliotecas OpenSL sin mucho dolor? Me gustaria evitar

  • Tener que volver a vincular a.out(porque las herramientas de compilación son enormemente complicadas)
  • Alterar cualquier configuración global (porque otros desarrolladores trabajan en esta máquina)

¿Es posible hacer lo que espero aquí?

Fixee
fuente

Respuestas:

22

Puede sustituir temporalmente una biblioteca diferente para esta ejecución particular. En Linux, la variable de entorno LD_LIBRARY_PATH es un conjunto de directorios separados por dos puntos donde las bibliotecas deben buscarse primero, antes del conjunto estándar de directorios; Esto es útil al depurar una nueva biblioteca o al usar una biblioteca no estándar para fines especiales. La variable de entorno LD_PRELOAD enumera las bibliotecas compartidas con funciones que anulan el conjunto estándar, al igual que /etc/ld.so.preload. - Bibliotecas compartidas

También puede invocar el cargador directamente:

/lib/ld-linux.so.2 --library-path path executable

David Schwartz
fuente
1
LD_LIBRARY_PATH no anula la ruta de búsqueda predeterminada. Lo configuré pero ldd todavía me muestra la ruta predeterminada del sistema, no la anulada. Aunque puedo forzar la carga de mi propia biblioteca configurando LD_PRELOAD.
Calmarius
18

Escriba un script de contenedor que establezca la LD_LIBRARY_PATHvariable de entorno. Este es el colgante de PATHlas bibliotecas compartidas. La ruta de búsqueda del sistema siempre se busca después de los directorios listados en $LD_LIBRARY_PATH. Consulte el manual del enlazador dinámico como referencia.

#!/bin/sh
export LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib
exec /path/to/a.out "$@"

O, por una vez, directamente en la línea de comando:

LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib ./a.out

Alternativamente, si desea modificar el binario, intente chrpath , que le permite editar la ruta de búsqueda de la biblioteca en el ejecutable.

Gilles 'SO- deja de ser malvado'
fuente
2
+1 para chrpath. Exactamente lo que necesitaba.
Raghav RV
Bonita historia, Microsoft es demasiado estúpido para pasar 2 minutos buscando en Google y está recomendando a todos que utilicen LD_LIBRARY_PATH en lugar de vincular SQL Server a openss-1.0.0 explícitamente o recompilar a la versión de openssl.so blogs.msdn.microsoft.com/sql_server_team / ...
Evan Carroll