2011-06-12 15 views
15

Tengo un "CeeloPartyServer" binario que necesita encontrar libFoundation.so en tiempo de ejecución, en una máquina FreeBSD. Ambos están en el mismo directorio. Compilo (en otra plataforma, usando un compilador cruzado) CeeloPartyServer usando el indicador 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 está encontrando la biblioteca cuando intento ejecutarlo? Mi línea de enlazador exacta es: -lm -lmysql -rpath = $ ORIGIN. Estoy bastante seguro de que no tengo que escapar \ u0026quot; ni nada de eso ya que mi análisis readelf de hecho muestra que la biblioteca rpath está configurada en $ ORIGEN. ¿Qué me estoy perdiendo?

Respuesta

32

Supongo que está utilizando gcc y binutils.

Si lo hace

readelf -d CeeloPartyServer | grep ORIGIN 

Debe volver a la línea de rPath que encontraste anteriormente, pero también se debe ver algunas entradas sobre banderas. Lo siguiente es de una biblioteca que construí.

0x000000000000000f (RPATH)    Library rpath: [$ORIGIN/../lib] 
0x000000000000001e (FLAGS)    ORIGIN 
0x000000006ffffffb (FLAGS_1)   Flags: ORIGIN 

Si usted no está viendo algún tipo de entradas banderas, es probable que no haya dicho al enlazador para marcar el objeto de que exige el procesamiento origen. Con binutils ld, puede hacer esto pasando el indicador -z origin.

Supongo que está utilizando gcc para conducir el enlace, por lo que en ese caso necesitará pasar la bandera a través del compilador agregando -Wl,-z,origin a su línea de enlace gcc.

+0

Todos sus suposiciones son correctas. No estoy usando la bandera de origen -z, nunca vi eso documentado en ninguna parte. Te dejaré saber si eso lo resuelve. – Nektarios

10

Dependiendo de la cantidad de capas que pase esta bandera antes de que el vinculador la vea, es posible que deba utilizar $$ORIGIN o incluso \$$ORIGIN. Sabrá que lo tiene correcto cuando readelf muestra un encabezado RPATH que se parece a $ORIGIN/../lib o similar. Los $ adicionales y la barra invertida son solo para evitar que el $ sea procesado por otras herramientas en la cadena.

+4

Solo para aclarar a otros (como yo) que están menos familiarizados con RPATH: Al configurar RPATH durante la compilación, intente 'LDFLAGS =" - Wl, -ruta, '\ $ \ $ ORIGIN' -Wl, -z, origen " '; donde 'echo $ LDFLAGS' dará:' ​​-Wl, -rpath, '$$ ORIGIN' -Wl, -z, origin'. (Hay alguna magia Makefile con '$$'.) – kevinarpe

+0

Use 'readelf -d' para ver el encabezado relevante, o' chrpath'. – Richard

0

\ $ \ ORIGEN si está utilizando chrpath y \ $ \ $ ORIGEN si usted está proporcionando directamente en LDFLAGS

Cuestiones relacionadas