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?

¿Fue útil?

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

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