Il existe un outil plus universel que chrpath
appelé patchelf
. Il a été créé à l'origine pour être utilisé dans la création de packages pour Nix et NixOS (système de packages et distribution GNU/Linux).
Dans le cas où il n'y a pas de rpath dans un binaire (appelé ici rdsamp), chrpath
échoue :
chrpath -r '$ORIGIN/../lib64' rdsamp
rdsamp: no rpath or runpath tag found.
D'autre part,
patchelf --set-rpath '$ORIGIN/../lib64' rdsamp
réussit très bien.
Il existe un outil appelé chrpath
qui peut faire cela - il est probablement disponible dans les packages de votre distribution.
Tout comme @user7610 l'a dit, la bonne façon de procéder est le 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 parlent de RPATH
, mais ils signifient en fait RUNPATH
. Ce sont deux sections dynamiques facultatives 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, n'oubliez pas :
- Si
RUNPATH
est défini,RPATH
est ignoré RPATH
est obsolète et doit être évitéRUNPATH
est préféré car il peut être remplacé parLD_LIBRARY_PATH
Voir le R[UN]PATH actuel
readelf -d <path-to-elf> | egrep "RPATH|RUNPATH"
Effacer le R[UN]PATH
patchelf --remove-rpath <path-to-elf>
Remarques :
- Supprime les deux
RPATH
etRUNPATH
Ajouter des valeurs à R[UN]PATH
patchelf [--force-rpath] --set-rpath "<desired-rpath>" <path-to-elf>
Remarques :
<desired-path>
est une liste de répertoires séparés par deux-points, par exemple :/my/libs:/my/other/libs
- Si vous spécifiez
--force-rpath
, définitRPATH
, sinon définitRUNPATH