Puis-je modifier 'rpath' dans un binaire compilé?
J'ai un vieux fichier exécutable qui est prévue pour le tas de ferraille, mais il n'y est pas encore. Il s'appuie sur certaines libs qui ont été supprimés de mon environnement, mais j'ai quelques stub libs dans un endroit où il fonctionne très bien. Id tiens à souligner cet exécutable à ces stub libs. Oui, je pourrais le mettre LD_LIBRARY_PATH, mais cet exécutable est appelée à partir de nombreux scripts, et de nombreux utilisateurs, et j'aimerais la réparer en un seul endroit.
Je n'ai pas de source pour ce faire, et il serait difficile de l'obtenir. Je pensais - puis-je modifier ce fichier, à l'aide d'un ELFE de la conscience de l'éditeur, et ajouter un CHEMIN simple pour rpath de l'avoir frappé la nouvelle libs? Est-ce possible, ou une fois que vous créez un binaire ELF, vous arranger les choses et les lieux et ils ne peuvent pas être déplacés?
- L'envelopper dans un shell script qui définit LD_LIBRARY_PATH et appelle le binaire. Mettre le script shell dans un endroit qui est dans les appelants du CHEMIN.
- LD_LIBRARY_PATH est héritée par les processus enfants. Vous ne pourriez pas vouloir cela.
- ouais et je l'ai déjà dit je ne veux pas le faire. 🙂
Vous devez vous connecter pour publier un commentaire.
Il existe un outil appelé
chrpath
qui peut le faire - c'est probablement disponibles en paquets de votre distribution.install_name_tool
pouvez faire cela avec le-rpath
drapeau<binary>: no rpath or runpath tag found.
, vous ne pouvez pas utiliserchrpath
pour le remplacer, mais vous pouvez utiliserpatchelf
dans ce cas:patchelf --set-rpath /path/to/libaries <binary>
Il est plus universel que la
chrpath
appelépatchelf
. Il a été initialement créé pour une utilisation dans la fabrication de paquets pour Nix et NixOS (système d'emballage et une distribution GNU/Linux).Dans le cas où il n'y a pas de rpath dans un fichier binaire (ici appelé rdsamp),
chrpath
échoue:D'autre part,
réussit très bien.
patchelf
est en mesure d'ajouter un rpath binaire, qui ne contiennent pas une rpath, encore - oùchrpath
ne semble pas être en mesure de modifier un déjà présent à l'entrée.rpath
etrunpath
. Fondamentalement, on peut remplacerLD_LIBRARY_PATH
et les autres ne le peuvent pas. Pour plus de détails, voir blog.tremily.us/posts/rpathchrpath
etpatchelf
sont bâclée avec leur terminologie. Par exemple, lepatchelf
commande ci-dessus va changerrunpath
mais pasrpath
, sauf si vous fournissez également le--force-rpath
option.patchelf
explique: "--set-rpath
,--shrink-rpath
et--print-rpath
préfèrent maintenantDT_RUNPATH
surDT_RPATH
, qui est obsolète. Lors de la mise à jour, si les deux sont présents, les deux sont mis à jour. Si seulement DT_RPATH est présent, il est convertiDT_RUNPATH
sauf--force-rpath
est spécifié. Si aucune n'est présente, unDT_RUNPATH
est ajouté, à moins que--force-rpath
est spécifié, dans ce cas, unDT_RPATH
est ajouté." Le nom de l'option a probablement été conservé pour des raisons de compatibilité.patchelf --set-rpath /opt/my-libs/lib:/foo/lib program
Cela provoque l'éditeur de liens dynamique de recherche dans /opt/mon-libs/lib et /foo/lib pour les bibliothèques partagées nécessaires par le programme.`patchel
. Pour empêcher l'expansion, lors de l'exécution de patchelf, le rpath est unique cité. C'est expliqué dans les pages de manuel. man7.org/linux/man-pages/man8/ld.so.8.htmlTout comme @user7610 dit, la bonne façon de faire est la
patchelf
outil.Mais, je sens que je peux donner une réponse complète, couvrant toutes les commandes que l'on doit faire exactement cela.
Pour un article complet sur le sujet, cliquez ici
Tout d'abord, de nombreux développeurs parler
RPATH
, mais ils signifient réellementRUNPATH
. Ces deux facultatifs sections dynamiques, et le chargeur de poignées très différemment. Vous pouvez en lire plus sur la différence entre eux dans le lien que j'ai mentionné avant.Pour l'instant, rappelez-vous juste:
RUNPATH
est définie,RPATH
est ignoréRPATH
est obsolète et doit être évitéeRUNPATH
est préférée, car elle peut être remplacée parLD_LIBRARY_PATH
Voir le R[des nations UNIES]CHEMIN
Clairement le R[des nations UNIES]CHEMIN
Notes:
RPATH
etRUNPATH
Ajouter les valeurs dans R[des nations UNIES]CHEMIN
Notes:
<desired-path>
est une liste de répertoires séparés par des virgules, e.g:/my/libs:/my/other/libs
--force-rpath
, jeux deRPATH
, sinon ensemblesRUNPATH
-Wl,-R,<desired-rpath> -Wl,--enable-new-dtags
jeux deDT_RUNPATH
, et qui est celle que la plupart des gens à utiliser.RUNPATH
peut être remplacée parLD_LIBRARY_PATH
, de sorte que les gens ne devraient pas utiliser--force-rpath
.<desired-path>
utilise une virgule, il faut une virgule (qui est:/my/libs,/my/other/libs
).Cela a fonctionné pour moi, en remplacement de XORIGIN avec $ORIGINE.
chrpath -r '\$\ORIGIN/../lib64' httpd