command-line gcc linker codeblocks rpath

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