ruta=$ORIGEN no tener efecto deseado?
Pregunta
Tengo un binario "CeeloPartyServer" que necesita encontrar libFoundation.así que en tiempo de ejecución, en una máquina FreeBSD.Ambos están en el mismo directorio.Puedo compilar (en otra plataforma, el uso de un compilador cruzado) CeeloPartyServer el uso de vinculador de la bandera "-rpath=$ORIGEN".
> readelf -d CeeloPartyServer |grep -i rpath 0x0000000f (RPATH) Library rpath: [$ORIGIN] > ls CeeloPartyServer Contents Foundation.framework libFoundation.so > ./CeeloPartyServer /libexec/ld-elf.so.1: Shared object "libFoundation.so" not found, required by "CeeloPartyServer"
¿Por qué no es encontrar la biblioteca cuando trato de ejecutarlo?Exactamente mi enlazador de la línea es:-lm -lmysql -rpath=$ORIGEN.Estoy bastante seguro de que no tengo que escapar \$ o algo así que desde mi readelf análisis no en el hecho de mostrar que la biblioteca de la ruta se establece en $ORIGEN.Lo que me estoy perdiendo?
Solución
Supongo que estás usando GCC y Binutils.
Si lo haces
readelf -d CeeloPartyServer | grep ORIGIN
Debe recuperar la línea RPath que encontró arriba, pero también debe ver algunas entradas sobre las banderas. Lo siguiente es de una biblioteca que construí.
0x000000000000000f (RPATH) Library rpath: [$ORIGIN/../lib]
0x000000000000001e (FLAGS) ORIGIN
0x000000006ffffffb (FLAGS_1) Flags: ORIGIN
Si no está viendo algún tipo de entradas de banderas, probablemente no haya dicho al enlazador que marque el objeto como un procesamiento de origen. Con binutils ld, haces esto pasando el -z origin
bandera.
Sin embargo, supongo que está utilizando GCC para conducir el enlace, por lo que en ese caso deberá pasar la bandera a través del compilador agregando -Wl,-z,origin
a su línea de enlace GCC.
Otros consejos
Dependiendo de cuántas capas de este indicador pasa a través de antes de que el enlazador lo ve, puede que necesite utilizar $$ORIGIN
o incluso \$$ORIGIN
.Usted sabrá que usted tiene la razón cuando readelf
muestra una RUTA de encabezado que se parece a $ORIGIN/../lib
o similar.El extra de $ y la barra diagonal inversa son sólo para prevenir el $ de ser procesados por otras herramientas en la cadena.
$ Origen si está utilizando Chrpath y $ $ Origin si proporciona directamente en Ldflags