command line - Cómo obtener RPATH con $ ORIGIN para trabajar en Code:: Blocks GCC?
command-line linker (3)
Estoy intentando vincular un RPATH que contiene la cadena especial $ ORIGIN en un archivo ejecutable creado utilizando GCC con Code :: Blocks IDE. He especificado
-Wl,-R$ORIGIN
en las opciones del vinculador para el proyecto, pero la salida de línea de comando a GCC es incorrecta (despojada de la claridad):
g++ -Wl,-R
¿Cuál es la forma correcta de especificar este argumento para Code :: Blocks?
Quien haya decidido hacer el token $ ORIGIN es un bastardo malvado que merece un lugar especial en el infierno de los programadores. Dado que ''$'' es un caracter especial para bash y otros lenguajes de scripting como make, lo arruina todo a menos que se escape con cuidado. Peor aún, dependiendo del entorno de compilación que esté utilizando, es probable que los detalles de cómo escapar correctamente cambien.
En bash, necesitas poner una barra invertida frente a $:
-Wl,-R/$ORIGIN
Code :: Blocks aparentemente también trata los $ como especiales. 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 diagonal inversa como el $ necesitan doblarse para escapar correctamente. Por lo tanto, en la configuración del vinculador Code :: Blocks, debe especificar:
-Wl,-R//$$ORIGIN
... qué resultados:
-Wl,-R//$ORIGIN
... al registro de construcción, pero el caparazón realmente se envía:
-Wl,-R/$ORIGIN
... que como se mencionó anteriormente produce el resultado deseado.
Que dolor.
Si su ejecutable está siendo desarrollado por un entorno de script enorme complejo no creado por usted, y no desea profundizar en eso, tratando de 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 trozo en el camino. En la práctica, se le puede llamar para compilar archivos .so u otros archivos ejecutables, por lo que es posible que deba hacer que este sea un script más complejo que decida si se debe insertar el RPATH. O bien, ejecuta build sin esto, y con, y cherry pick.
(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, ver variables de entorno gcc para anularlo. El kilometraje puede variar. solamente. No se garantiza que sea menos horrible que cualquier otro enfoque).
Además de la respuesta de kblucks que aborda la pregunta de Código: Bloques ... Para aquellos como yo que tropezaron con esta página buscando cómo hacer esto con Make. El truco es usar un signo $ adicional como un carácter de escape y adjuntarlo con comillas:
-Wl,-R,''$$ORIGIN/../lib''
Se puede tener una explicación completa aquí: Usar ORIGEN para una ruta de búsqueda dinámica de biblioteca en tiempo de ejecución