J'ai un ancien exécutable qui est prévu pour le tas de ferraille, mais il n'est pas encore là. Il repose sur des bibliothèques qui ont été supprimées de mon environnement, mais j'ai des bibliothèques stub quelque part où cela fonctionne correctement. J'aimerais pointer cet exécutable vers ces bibliothèques stub. Oui, je pourrais définir LD_LIBRARY_PATH, mais cet exécutable est appelé à partir de nombreux scripts, et de nombreux utilisateurs et j'aimerais le réparer en un seul endroit.
Je n'ai pas de source pour cela et il serait difficile de l'obtenir. Je pensais - puis-je modifier ce fichier, en utilisant un éditeur compatible ELF, et ajouter un simple PATH à rpath pour qu'il atteigne les nouvelles bibliothèques? Est-ce possible, ou une fois que vous créez un binaire ELF, vous corrigez les choses aux emplacements et ils ne peuvent pas être déplacés?
Réponses:
Il existe un outil appelé
chrpath
qui peut le faire - il est probablement disponible dans les packages de votre distribution.la source
install_name_tool
peut le faire avec le-rpath
drapeau<binary>: no rpath or runpath tag found.
chrpath
patchelf
patchelf --set-rpath /path/to/libaries <binary>
Il existe un outil plus universel que celui
chrpath
appelépatchelf
. Il a été créé à l'origine pour être utilisé dans la création de paquets pour Nix et NixOS (système d'empaquetage et distribution GNU / Linux).Dans le cas où il n'y a pas de rpath dans un binaire (ici appelé rdsamp),
chrpath
échoue:D'autre part,
réussit très bien.
la source
patchelf
est capable d'ajouter un rpath à un binaire qui ne contient pas encore de rpath - oùchrpath
seulement semblent pouvoir modifier une entrée déjà présente.rpath
etrunpath
. En gros, l'un peut passer outreLD_LIBRARY_PATH
et l'autre non. Pour plus de détails, voir blog.tremily.us/posts/rpathchrpath
etpatchelf
sont bâclés avec leur terminologie. Par exemple, lapatchelf
commande indiquée ci-dessus changera,runpath
mais pas àrpath
moins que vous ne fournissiez également l'--force-rpath
option.patchelf
explique: "--set-rpath
,--shrink-rpath
et--print-rpath
préfère maintenantDT_RUNPATH
àDT_RPATH
, qui est obsolète. Lors de la mise à jour, si les deux sont présents, les deux sont mis à jour. Si seul DT_RPATH est présent, il est converti enDT_RUNPATH
sauf si--force-rpath
spécifié. Si aucun n'est présent , aDT_RUNPATH
est ajouté sauf indication--force-rpath
contraire, auquel cas aDT_RPATH
est ajouté. " Le nom de l'option n'a probablement pas été modifié pour des raisons de compatibilité.Tout comme @ user7610 l'a dit, la bonne façon de procéder est l'
patchelf
outil.Mais je pense que je peux donner une réponse plus complète, couvrant toutes les commandes dont on a besoin pour faire exactement cela.
Pour un article complet sur le sujet, cliquez ici
Tout d'abord, de nombreux développeurs en parlent
RPATH
, mais ils veulent direRUNPATH
. Ce sont deux sections dynamiques optionnelles différentes, et le chargeur les gère très différemment. Vous pouvez en savoir plus sur la différence entre eux dans le lien que j'ai mentionné précédemment.Pour l'instant, rappelez-vous simplement:
RUNPATH
est défini,RPATH
est ignoréRPATH
est obsolète et doit être évitéRUNPATH
est préférable car il peut être remplacé parLD_LIBRARY_PATH
Voir le R [UN] PATH actuel
Effacer le CHEMIN R [UN]
Remarques:
RPATH
etRUNPATH
Ajouter des valeurs à R [UN] PATH
Remarques:
<desired-path>
est une liste de répertoires séparés par des virgules, par exemple:/my/libs:/my/other/libs
--force-rpath
, définitRPATH
, sinon définitRUNPATH
la source
-Wl,-R,<desired-rpath> -Wl,--enable-new-dtags
ensemblesDT_RUNPATH
, et c'est celui que la plupart des gens devraient utiliser.RUNPATH
peut être remplacé parLD_LIBRARY_PATH
, donc les gens ne devraient pas utiliser--force-rpath
.<desired-path>
utilise un deux-points; ce devrait être une virgule (c'est-à-dire:)/my/libs,/my/other/libs
.Cela a fonctionné pour moi, en remplaçant XORIGIN par $ ORIGIN.
chrpath -r '\$\ORIGIN/../lib64' httpd
la source