Pregunta

Estoy tratando de vincular un RPATH que contiene la cadena especial $ ORIGIN en un ejecutable creado usando GCC con Code :: Blocks IDE. He especificado

-Wl,-R$ORIGIN

en las opciones del enlazador para el proyecto, pero la salida de la línea de comandos a GCC es incorrecta (eliminada para mayor claridad):

g++ -Wl,-R

¿Cuál es la forma correcta de especificar este argumento para Code :: Blocks?

¿Fue útil?

Solución

Quien haya decidido que el token $ ORIGEN es un bastardo malvado que merece un lugar especial en el infierno del programador. Ya que '$' es un carácter especial para bash y otros lenguajes de scripts como make, arruina todo a menos que se escape con cuidado. Lo que es peor, dependiendo del entorno de compilación que estés utilizando, es probable que cambien los detalles específicos de cómo escapar adecuadamente.

En el bash, debes pegar una barra invertida delante de $:

-Wl,-R\$ORIGIN

Code :: Blocks aparentemente también trata el $ como especial. Entonces, cualquiera que sea el controlador de subproceso Code :: Blocks envía el comando para tratar la barra invertida como especial. Por lo tanto, tanto la barra invertida como el $ deben duplicarse para poder escapar correctamente. Por lo tanto, en la configuración del enlazador Code :: Blocks, debe especificar:

-Wl,-R\\$ORIGIN

... que genera:

-Wl,-R\\$ORIGIN

... al registro de compilación, pero el shell realmente se envía:

<*>

... que como se mencionó anteriormente produce el resultado deseado.

Qué dolor.

Otros consejos

Además de la respuesta de Kblucks que aborda la pregunta sobre Código: Bloques ... Para aquellos como yo, que tropezamos en esta página buscando cómo hacer esto con Make. El truco es usar un signo de $ extra como un carácter de escape y encerrarlo entre comillas:

-Wl,-R,'$ORIGIN/../lib'

La explicación completa se puede tener aquí: Uso de ORIGIN para un tiempo de ejecución dinámico ruta de búsqueda de la biblioteca

Si su ejecutable está siendo construido por un enorme entorno de script complejo que usted no creó y no quiere profundizar en eso, intente ejecutar con setenv LD_RUN_PATH = '$ ORIGIN /../ lib' ; Si eso no funciona, un enfoque pragmático es crear un contenedor para ld:

#!/bin/sh
exec /usr/bin/ld -R '$ORIGIN/../lib' "$@"

... luego haz la compilación con ese código auxiliar en la ruta. En la práctica, se puede llamar para crear archivos .so u otros ejecutables, por lo que es posible que tenga que hacer de este un script más complejo que decida si se debe insertar el RPATH. O bien, ejecute compilación sin esto, y con, y selección de cereza.

(aquí '' / usr / bin / ld '' es el ld que normalmente se habría ejecutado, que puede estar en otro lugar. gcc puede no recoger ld de la ruta, consulte las variables de entorno gcc para anular eso. Mileage may variar. Solo uso. No se garantiza que sea menos horrible que cualquier otro enfoque).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top