gcc - rpath=$ ORIGEN no tiene el efecto deseado?
linker freebsd (3)
Tengo un "CeeloPartyServer" binario que necesita encontrar libFoundation.so en tiempo de ejecución, en una máquina de FreeBSD. Ambos están en el mismo directorio. Compilo (en otra plataforma, usando un compilador cruzado) CeeloPartyServer usando la bandera del enlazador "-rpath = $ ORIGIN".
> 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 encuentra la biblioteca cuando intento ejecutarla? Mi línea de enlace exacta es: -lm -lmysql -rpath = $ ORIGIN. Estoy bastante seguro de que no tengo que escapar de / $ ni nada por el estilo, ya que mi análisis personal muestra que la ruta de la biblioteca está configurada en $ ORIGEN. ¿Qué me estoy perdiendo?
Dependiendo de la cantidad de capas por las que pasa este indicador antes de que lo vea el vinculador, es posible que deba usar $$ORIGIN
o incluso /$$ORIGIN
. Sabrá que está en lo cierto cuando readelf
mostrar un encabezado RPATH que parece $ORIGIN/../lib
o similar. Los $ extra y la barra invertida son solo para evitar que $ sean procesados por otras herramientas en la cadena.
Supongo que estás usando gcc y binutils.
Si lo haces
readelf -d CeeloPartyServer | grep ORIGIN
Debería recuperar la línea RPATH que encontró anteriormente, pero también debería ver algunas entradas sobre indicadores. 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 FLAGS, es probable que no le haya dicho al vinculador que marque el objeto como que requiere procesamiento de origen. Con binutils ld, lo hace pasando la bandera de -z origin
.
Sin embargo, supongo que está utilizando gcc para dirigir el enlace, por lo que en ese caso tendrá que pasar la bandera a través del compilador agregando -Wl,-z,origin
a su línea de enlace de gcc.
/ $ / ORIGIN si está usando chrpath y / $ / $ ORIGEN si está proporcionando directamente en LDFLAGS