Comment le nom d'une bibliothèque partagée après la construction d'un programme puis-je changer cela dépend?

StackOverflow https://stackoverflow.com/questions/2759254

Question

J'ai un programme qui dépend d'une bibliothèque partagée, il attend de trouver au fond d'une structure de répertoire. Je propose que la bibliothèque partagée dehors et dans un meilleur endroit. Sur OS X, cela peut être fait avec install_name_tool. Je suis incapable de trouver un équivalent pour Linux.

Pour référence, spits de readelf -d myprogram sur la sortie paraphrase suivante:

Dynamic section at offset 0x1e9ed4 contains 30 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [this/is/terrible/library.so]
 0x00000001 (NEEDED)                     Shared library: [libGL.so.1]
 0x00000001 (NEEDED)                     Shared library: [libGLU.so.1]
 0x00000001 (NEEDED)                     Shared library: [libstdc++.so.6]
(continues in an uninteresting fashion)

(et sur demande, ldd myprogram:)

    linux-gate.so.1 =>  (0x0056a000)
    this/is/terrible/library.so => not found
    libGL.so.1 => /usr/lib/mesa/libGL.so.1 (0x0017d000)
    libGLU.so.1 => /usr/lib/libGLU.so.1 (0x00a9c000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00710000)
   (etc, etc)

et je voudrais errata "ce / est / mauvais / library.so" à "shared / library.so". Notez que, si le programme est laissé dans son « construit » emplacement, où le chemin relatif ce / est / mauvais / library.so existe réellement, alors est ldd capable de le trouver, comme on pouvait s'y attendre.

Je sais RPATH et ce n'est pas ce que je cherche, je ne pas besoin de changer les chemins de recherche à l'échelle mondiale.

Était-ce utile?

La solution

HT - cela pourrait être utile.

  

HT est un éditeur de fichier / spectateur / analyseur pour executables. L'objectif est de combiner les fonctionnalités de bas niveau d'un débogueur et la facilité d'utilisation des IDEs. Nous prévoyons de mettre en œuvre tous (hex-) les fonctionnalités d'édition et le support des formats de fichiers plus importants.

Je ne pouvais pas trouver quelque chose de très différent de la solution de ZorbaTHut, mais peut-être il est possible de mettre un nom avec une longueur différente et garder toujours le binaire valide.

FAES - cela pourrait être utile aussi.

  

Gelf est une API générique, ELF classe indépendante pour manipulat-        fichiers ELF objet ing. Gelf fournit un seul inter commun        visage pour le traitement 32 bits et 64 bits des fichiers d'objets format ELF.

Autres conseils

Nous pouvons utiliser patchelf :

patchelf --replace-needed liboriginal.so.1 libreplacement.so.1 my-program

Nous pouvons également supprimer une dépendance:

patchelf --remove-needed libfoo.so.1 my-program

Ajouter une dépendance:

patchelf --add-needed libfoo.so.1 my-program

Ou changer le chemin où chercher les bibliothèques ( rpath ):

patchelf --set-rpath /path/to/lib:/other/path my-program

Publier une tentative, horrible, solution aki.

Les dépendances de bibliothèque sont stockées dans un bloc d'ELF connu sous le nom de bloc .depends. Le format de ce bloc est un large éventail d'identifiant / paires de stringpointer, avec le stringpointer pointant vers une chaîne standard à zéro terminal C situé quelque part dans le binaire.

Vous voyez où cela va, à droite?

Oui, tant que le nouveau chemin dont vous avez besoin est pas plus grand que l'ancien chemin, vous pouvez juste atteindre directement dans le binaire et faire une simple chaîne remplacer. Assurez-vous de ne pas ajouter ou supprimer des octets ou vous briser l'ensemble binaire. Si vous voulez être plus en sécurité, vous pouvez réellement traverser la structure ELF pour vous assurer eu le bon endroit -. En ce moment je suis en train de vérifier pour vous assurer que les émissions de la chaîne source exactement une fois

ELF inclut une somme de contrôle, mais apparemment il n'y a pas chargeur qui fait le vérifie, il est « sûr » - mais en désordre -. Ignorer

La « vraie solution » serait un utilitaire qui a permis à faible niveau manipulations généralisées de la structure ELF. Pour autant que je sache, aucune utilité existe, quoi que ce soit, sauf quelques cas spécialisés (rpath, la plupart du temps.) Je ne prétends pas savoir comment l'utilité d'un tel difficile serait d'écrire.

J'aimerais absolument une meilleure solution à cela, mais, jusqu'à présent, cela semble travail.

Vous pouvez utiliser LD_LIBRARY_PATH pour modifier le chemin de recherche des bibliothèques partagées. Si votre programme dépend d'un particulier chemin relatif comme votre montre par exemple, vous aurez toujours besoin d'avoir cette structure de répertoire. En d'autres termes, vous pouvez déplacer le répertoire lib de /home/user/dev/project/this/is/terrible/library.so à /usr/local/lib/this/is/terrible/library.so mais pas /usr/local/lib/library.so

Si vous pouvez reconstruire votre programme, vous pouvez alors changer le chemin relatif, il utilise pour la lib.

Il y a un peu plus d'informations sur libs partagées dans Linux http: / /tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top