mac compile makefile openssl rpath

makefile - compile - Cómo compilar openssl con relativa ruta



openssl mac (3)

En tu archivo MAKE intenta:

-Wl,-rpath,${ORIGIN}/../lib64

Supongo que ORIGEN es una variable de shell.

EDITAR

Acabo de encontrar una respuesta a su pregunta (mejor tarde que nunca): debe evitar crear a partir de variables de interpolación, para hacer eso necesita usar $$ (doble signo de dolar):

-Wl,-rpath,''$$ORIGIN/../lib64''

Sé que funciona porque lo he probado con mi propia aplicación, disfruta :)

He estado intentando compilar openssl 1.0.0g con el siguiente rpath:

$ORIGIN/../lib64

Cada vez que readelf -d apps/openssl , readelf -d apps/openssl resultados como los siguientes dependiendo de la variación de escape que probé:

/RIGIN/../lib64 RIGIN/../lib64 ORIGIN/../lib64

Quiero configurar mi rpath sin usar herramientas externas como chrpath. ¿Es posible? Básicamente aceptaré cualquier cosa que no implique el uso de herramientas externas como chrpath (aunque ya habría terminado con eso).

Idealmente, me gustaría hacerlo pasando opciones en la línea de comando (cualquier forma de -Wl,-rpath,$ORIGIN/../lib64 ).

No me importa editar el Makefile generado, que es lo que he estado intentando al final. ¡Si solo pudiera hacerlo imprimir un estúpido signo de dólar! Traté de modificar LIBRPATH en el bloque BUILDENV = sin suerte. Mis mejores resultados hasta ahora:

LIBRPATH=$$''ORIGIN/../lib64 # result: /../lib64 LIBRPATH=$$$$''ORIGIN/../lib64 # result: 12345<pid>/../lib64

He leído varias preguntas relacionadas con el tema y he intentado varios trucos para escaparse y citar, ¡pero nada ha funcionado tan lejos!


Fui por el camino de Chrpath. http://enchildfone.wordpress.com/2010/03/23/a-description-of-rpath-origin-ld_library_path-and-portable-linux-binaries/

Es bastante complicado contrarrestar la expansión de shell de `$$ ORIGIN`` en openssl. Tarde o temprano, se expande debido al signo de dólar. Si realmente quieres ir por este camino, puedes hacerlo. He encontrado lo siguiente para trabajar con openssl 1.0.1g en Linux. En Makefile.shared, busca esta línea:

DO_GNU_APP=LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBRPATH)"

Reemplácelo con lo siguiente. Esta cita-fu neutraliza la expansión de $ . El doble $$ es la forma de obtener un solo signo de dólar en makefiles.

DO_GNU_APP=LDFLAGS="$(CFLAGS) -Wl,-rpath,''"''$$''"ORIGIN/../lib64''"

Después de compilar:

readelf -d apps/openssl | grep RPATH 0x000000000000000f (RPATH) Library rpath: [''$ORIGIN/../lib64'']


No me importa editar el Makefile generado, que es lo que he estado intentando por última vez ...

No estoy seguro de que pueda establecerlo con una variable de shell y una ruta relativa. No creo que ldd expanda $ORIGIN en $ORIGIN/../lib64 . En este caso, creo que necesita usar ldconfig para agregar $ORIGIN/../lib64 a las rutas de búsqueda de la biblioteca. Consulte encontrar la ruta de búsqueda ldd en Server Fault para obtener más detalles.

Como no estoy seguro, daré las instrucciones de todos modos. No necesita cambiar los Makefiles. De hecho, no tuve suerte en el pasado porque las cosas se sobrescriben, y otras cosas como CFLAGS y LDFLAGS son ignoradas.

Ver también Build OpenSSL con RPATH? Su pregunta y la pregunta citada son preguntas diferentes que convergen en respuestas similares (no hay duplicados entre ellas). Pero proporciona la posición del desarrollador OpenSSL en RPATHs. Era un correo electrónico privado, así que compartí los detalles relevantes en lugar de todo el mensaje.

Si logras insertar $ORIGIN/../lib64 en la sección ELF y funciona, informa por favor. A continuación, uso /usr/local/ssl/lib para mi RPATH. Debe sustituir $ORIGIN/../lib64 por /usr/local/ssl/lib .

OpenSSL admite RPATH de RPATH para objetivos BSD (pero no otros). Desde Configurar:

# Unlike other OSes (like Solaris, Linux, Tru64, IRIX) BSD run-time # linkers (tested OpenBSD, NetBSD and FreeBSD) "demand" RPATH set on # .so objects. Apparently application RPATH is not global and does # not apply to .so linked with other .so. Problem manifests itself # when libssl.so fails to load libcrypto.so. One can argue that we # should engrave this into Makefile.shared rules or into BSD-* config # lines above. Meanwhile let''s try to be cautious and pass -rpath to # linker only when --prefix is not /usr. if ($target =~ /^BSD/-/) { $shared_ldflag.=" -Wl,-rpath,/$(LIBRPATH)" if ($prefix !~ m|^/usr[/]*$|); }

La forma más fácil de hacerlo para OpenSSL 1.0.2 parece ser agregarlo a indicadores del enlazador durante la configuración

./config -Wl,-rpath=/usr/local/ssl/lib

También puede editar Configurar línea y codificar el rpath . Por ejemplo, estoy trabajando en Debian x86_64. Así que abrí el archivo Configure en un editor, copié linux-x86_64 , lo linux-x86_64-rpath e hice el siguiente cambio para agregar la opción -rpath :

"linux-x86_64-rpath", "gcc:-m64 -DL_ENDIAN -O3 -Wall -Wl,-rpath=/usr/local/ssl/lib:: -D_REENTRANT::-Wl,-rpath=/usr/local/ssl/lib -ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL: ${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so./$(SHLIB_MAJOR)./$(SHLIB_MINOR):::64",

Arriba, los campos 2 y 6 fueron cambiados. Corresponden a $cflag y $ldflag en el sistema de compilaciones de OpenSSL.

Luego, configure con la nueva configuración:

$ ./Configure linux-x86_64-rpath shared no-ssl2 no-ssl3 no-comp / --openssldir=/usr/local/ssl enable-ec_nistp_64_gcc_128

Finalmente, después de make , verifica la configuración:

$ readelf -d ./libssl.so | grep -i rpath 0x000000000000000f (RPATH) Library rpath: [/usr/local/ssl/lib] $ readelf -d ./libcrypto.so | grep -i rpath 0x000000000000000f (RPATH) Library rpath: [/usr/local/ssl/lib] $ readelf -d ./apps/openssl | grep -i rpath 0x000000000000000f (RPATH) Library rpath: [/usr/local/ssl/lib]

Una vez que realice make install , entonces ldd producirá los resultados esperados:

$ ldd /usr/local/ssl/lib/libssl.so linux-vdso.so.1 => (0x00007ffceff6c000) libcrypto.so.1.0.0 => /usr/local/ssl/lib/libcrypto.so.1.0.0 (0x00007ff5eff96000) ... $ ldd /usr/local/ssl/bin/openssl linux-vdso.so.1 => (0x00007ffc30d3a000) libssl.so.1.0.0 => /usr/local/ssl/lib/libssl.so.1.0.0 (0x00007f9e8372e000) libcrypto.so.1.0.0 => /usr/local/ssl/lib/libcrypto.so.1.0.0 (0x00007f9e832c0000) ...