2013-01-03 2 views
1

J'ai un problème concernant la liaison d'une bibliothèque partagée avec une convention de dénomination non standard sous plusieurs répertoires. J'ai besoin de l'exécutable généré pour rechercher la bibliothèque partagée dans l'emplacement actuel des exécutables, mais je ne trouve pas de paramètre de ligne de commande pour forcer ce comportement.Force solib dépendance d'avoir le chemin relatif de bibliothèque partagée nommée non standard sous un répertoire utilisant gcc

Pour démontrer ce comportement, tout ce qui est requis est une bibliothèque partagée qui se trouve sous un répertoire.

gcc -shared mylib.c -o some/dir/mylib.so 

gcc main.c -o main -Lsome/dir -l:mylib.so 

L'exécutable principal donne la sortie ldd suivante:

ldd main 
    some/dir/mylib.so (0xf76e2000) 

La sortie que je requiers est:

ldd main 
    mylib.so => some/dir/mylib.so (0xf7700000) 

Cette sortie peut être créé si la bibliothèque est nommée conventionnelle comme libmylib.so plutôt que mylib.so comme ceci:

mv some/dir/mylib.so some/dir/libmylib.so 
gcc main.c -o main -Lsome/dir -lmylib 

Ce gouttes aussi le chemin some/dir dans la liste ldd selon les besoins.

J'ai étudié l'utilisation de rpath et des options de ligne de commande pour ld et gcc, mais je suis incapable de trouver une solution satisfaisante. Les exigences strictes d'une structure de nom et de répertoire non standard ne peuvent pas être modifiées facilement dans ce cas.

Ma question est comment puis-je forcer la dépendance de la bibliothèque par rapport au répertoire courant plutôt qu'absolue comme dans les deuxièmes options de ligne de commande de ldd à gcc.

Merci pour votre temps, j'espère avoir expliqué le problème raisonnablement.

Jon.

Répondre

0

Il existe une variable magique que vous pouvez passer à rpath pour ce faire: $ORIGIN. Voir man ld.so pour plus de détails.

Je pense que dans votre cas, la commande devrait ressembler à ceci (non testé):

gcc main.c -o main -Lsome/dir -lmylib -Wl,-rpath,'$ORIGIN/some/path' 

Notez que vous ne devez pas laisser le shell étendre $ORIGIN comme une variable shell.

BTW, ce fut le premier succès de Google pour "rpath relative".

+0

Merci j'apprécie la réponse, la commande que vous avez spécifié ne fonctionnera toutefois que si la bibliothèque est nommée conventially comme « libmylib.so », alors que l'on appelle mon ' mylib.so 'auquel cas je dois utiliser' -l: mylib.so '. Cela interrompt le chemin relatif créé par ldd et force un chemin absolu à la place. – Jon

+0

À droite, j'ai raté le côlon. Est-ce que la chose '$ ORIGIN' ne fonctionne pas dans votre cas? – ams

+0

Bonjour, il semble n'avoir aucun effet lorsque le nom de la bibliothèque absolue est utilisé (c'est-à-dire mylib.so). Jon. – Jon

1

Essayez d'ajouter soname dans votre bibliothèque partagée:

$ gcc -shared mylib.c -o some/dir/mylib.so -Wl,-soname=mylib.so 
$ gcc main.c -o main -Lsome/dir -l:mylib.so 
$ LD_LIBRARY_PATH=some/dir:$LD_LIBRARY_PATH ldd main 
     mylib.so => some/dir/mylib.so (0x00007fa7a4fd6000) 
Questions connexes