Existuje univerzálnější nástroj než chrpath
s názvem patchelf
. Původně byl vytvořen pro použití při vytváření balíčků pro Nix a NixOS (systém balení a distribuce GNU/Linux).
V případě, že v binárním souboru (zde nazývaném rdsamp) není rpath, chrpath
selže:
chrpath -r '$ORIGIN/../lib64' rdsamp
rdsamp: no rpath or runpath tag found.
Na druhou stranu
patchelf --set-rpath '$ORIGIN/../lib64' rdsamp
uspěje v pohodě.
Existuje nástroj nazvaný chrpath
který to umí – pravděpodobně je dostupný v balíčcích vaší distribuce.
Jak řekl @user7610, správnou cestou je patchelf
nástroj.
Cítím však, že mohu poskytnout komplexnější odpověď, která pokrývá všechny příkazy, které je k tomu potřeba udělat.
Pro komplexní článek na toto téma klikněte sem
Za prvé, mnoho vývojářů mluví o RPATH
, ale ve skutečnosti znamenají RUNPATH
. Jedná se o dvě různé volitelné dynamické sekce a nakladač s nimi zachází velmi odlišně. Více o rozdílu mezi nimi si můžete přečíst v odkazu, který jsem zmínil dříve.
Prozatím si pamatujte:
- Pokud
RUNPATH
je nastaven,RPATH
je ignorováno RPATH
je zastaralé a je třeba se mu vyhnoutRUNPATH
je preferováno, protože může být přepsánoLD_LIBRARY_PATH
Zobrazit aktuální R[UN]PATH
readelf -d <path-to-elf> | egrep "RPATH|RUNPATH"
Vymažte R[UN]PATH
patchelf --remove-rpath <path-to-elf>
Poznámky:
- Odstraní obě
RPATH
aRUNPATH
Přidejte hodnoty do R[UN]PATH
patchelf [--force-rpath] --set-rpath "<desired-rpath>" <path-to-elf>
Poznámky:
<desired-path>
je seznam adresářů oddělených dvojtečkou, např.:/my/libs:/my/other/libs
- Pokud zadáte
--force-rpath
, nastavíRPATH
, jinak nastavíRUNPATH