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í?

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


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.