Posso cambiare ‘rpath’ in un binario già compilato?

Ho un vecchio eseguibile programmato per l’ammasso di scarto, ma non è ancora lì. Si basa su alcune librerie che sono state rimosse dal mio ambiente, ma ho qualche lib di stub da qualche parte dove funziona bene. Mi piace indicare questo eseguibile a queste librerie di stub. Sì, potrei impostare LD_LIBRARY_PATH, ma questo eseguibile è chiamato da molti script e molti utenti e mi piacerebbe sistemarlo in un punto.

Non ho fonti per questo, e sarebbe difficile ottenerlo. Stavo pensando: posso modificare questo file usando un editor ELF e aggiungere un semplice PATH a rpath per far sì che colpisca le nuove librerie? È ansible, o quando crei un binario ELF, aggiusti le cose alle posizioni e non possono essere spostate?

C’è uno strumento chiamato chrpath che può farlo: è probabilmente disponibile nei pacchetti della tua distribuzione.

C’è uno strumento più universale di chrpath chiamato patchelf . È stato originariamente creato per l’uso nella creazione di pacchetti per Nix e NixOS (sistema di packaging e distribuzione GNU / Linux).

Nel caso in cui non ci sia rpath in un binario (qui chiamato rdsamp), chrpath fallisce:

 chrpath -r '$ORIGIN/../lib64' rdsamp rdsamp: no rpath or runpath tag found. 

D’altra parte,

 patchelf --set-rpath '$ORIGIN/../lib64' rdsamp 

succede bene.

Questo ha funzionato per me, sostituendo XORIGIN con $ ORIGIN.

chrpath -r '\$\ORIGIN/../lib64' httpd