2012-12-07 15 views
50

Ho un vecchio eseguibile programmato per l'heap 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.Posso cambiare 'rpath' in un binario già compilato?

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? È possibile, o quando crei un binario ELF, aggiusti le cose alle posizioni e non possono essere spostate?

+3

avvolgerlo in uno shellscript che imposta LD_LIBRARY_PATH e chiama il binario. Metti lo script della shell in un posto che si trova nel PERCORSO dei chiamanti. – wildplasser

+0

LD_LIBRARY_PATH è ereditato dai processi figli. Potresti non volerlo. – Will

+1

@sarà sì e ho già detto che non voglio farlo. :) –

risposta

52

C'è uno strumento chiamato chrpath che può fare questo - è probabilmente disponibile nei pacchetti della tua distribuzione.

+0

Ovviamente non sapevo di questo strumento, grazie mille –

+6

Solo una nota per gli utenti Mac, 'install_name_tool' può farlo con il flag' -rpath' –

+1

Se ottieni l'errore: ': no rpath o runpath tag found., non puoi usare 'chrpath' per sostituirlo, ma puoi usare' patchelf' in questo caso: 'patchelf --set-rpath/path/to/libaries ' – phyatt

94

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 v'è alcun 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 

riesce bene.

+6

In particolare, 'patchelf' è in grado di aggiungere un percorso a un binario che non contiene un percorso, eppure - dove 'chrpath' sembra essere in grado di modificare una voce già presente. – maxschlepzig

+2

Come nota generale, vale la pena di comprendere la sottile distinzione tra 'rpath' e' runpath'. Fondamentalmente, uno può sovrascrivere 'LD_LIBRARY_PATH' e l'altro no. Per i dettagli, vedere http://blog.tremily.us/posts/rpath/ –

+2

La cosa fastidiosa è che sia 'chrpath' che' patchelf' sono sciatti con la loro terminologia. Ad esempio, il comando 'patchelf' mostrato sopra cambierà' runpath' ma non 'rpath' a meno che tu non fornisca anche l'opzione' --force-rpath'. –

0

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

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

Problemi correlati