Comment encoder l’emplacement exécutable dans un chemin Linux?

J’ai un exécutable qui charge implicitement plusieurs bibliothèques .so, toutes construites par moi. Pour le déploiement, ou au moins le test / le débogage, je voudrais tous les avoir dans le même répertoire:

my_executable libmylib1.so libmylib2.so 

Pour que l’exécutable charge les bibliothèques implicitement, j’aimerais définir un rpath (DT_RUNPATH) pour le répertoire de l’exécutable. Avec OS X, je le ferais comme ça:

 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 

Notez le @loader_path/. qui forme le chemin de l’exécutable dans OS X. Avec Linux, le plus proche je peux y arriver est

 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 

Le problème ici est que sous Linux, le rpath suit le répertoire de travail en cours, pas le répertoire de l’exécutable. Y a-t-il un moyen d’accomplir la même chose sous Linux?

    Vous devez utiliser la chaîne littérale $ORIGIN comme chemin d’exécution, qui est considéré comme l’emplacement de l’exécutable par le chargeur dynamic.

    Une solution courante consiste à créer un wrapper de script shell qui détermine le répertoire dans lequel se trouve l’exécutable et définit correctement LD_LIBRARY_PATH avant d’exécuter l’exécutable réel.