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)
...