2012-09-13 24 views
9

Tengo un ejecutable que implícitamente carga varias bibliotecas .so, todas construidas por mí. Para la implementación, o al menos la prueba/depuración, me gustaría tener a todos en el mismo directorio:Cómo codificar la ubicación ejecutable en un rpath de Linux?

my_executable 
libmylib1.so 
libmylib2.so 

Para obtener el ejecutable para cargar las bibliotecas de manera implícita, me gustaría establecer una rpath (DT_RUNPATH) para el directorio del ejecutable. Con OS X, lo haría este modo:

clang -dynamiclib -o libmylib1.dylib -install_name @rpath/libmylib1.dylib src1.c src2.c  
clang -dynamiclib -o libmylib2.dylib -install_name @rpath/libmylib2.dylib src3.c src4.c 
clang -o my_executable -L. -llibmylib1.so -llibmylib2.so -Wl,-rpath,@loader_path/. main.c 

Aviso del @loader_path/. que forma rpath del ejecutable en OS X. Con Linux, lo más cerca que puede llegar a esto es

gcc -dynamiclib -o libmylib1.so src1.c src2.c  
gcc -dynamiclib -o libmylib2.so src3.c src4.c 
gcc -o my_executable -L. -llibmylib1.so -llibmylib2.so -Wl,-rpath=. main.c 

El El problema aquí es que en Linux el rpath sigue el directorio de trabajo actual, no el directorio del ejecutable. ¿Hay alguna manera de lograr lo mismo en Linux?

Respuesta

6

Debe usar la cadena literal $ORIGIN como el runpath, que se entiende como la ubicación del ejecutable por el cargador dinámico.

+0

¡Eso fue todo! Gracias. –

2

Una solución común es crear un contenedor de script de shell que averigüe en qué directorio se encuentra el ejecutable y establece LD_LIBRARY_PATH de manera apropiada antes de ejecutar el ejecutable real.

+3

Una solución común pero sucia, las personas deberían aprender sobre rpath – wich

Cuestiones relacionadas