Ignora LD_LIBRARY_PATH e bastone con biblioteca data attraverso -rpath in fase di collegamento

StackOverflow https://stackoverflow.com/questions/2408172

  •  18-09-2019
  •  | 
  •  

Domanda

Sono seduto in un ambiente che non ho alcun reale controllo su (non è solo a me, in modo sostanzialmente, non posso cambiare l'ambiente o non funzionerà per chiunque altro), l'unica cosa che può influenzare Ecco come si costruisce il binario.

Il mio problema è, l'ambiente specifica un LD_LIBRARY_PATH contenente un libstdc ++ che non è compatibile con il compilatore utilizzato. Ho provato a compilarlo in modo statico, ma questo non sembra possibile per g ++ (versione 4.2.3, sembra essere stato il lavoro svolto in questa direzione nelle versioni successive se non disponibili, -static-libstdc ++ o qualcosa di simile).

Ora sono arrivato a utilizzare rpath per cuocere il nome del percorso assoluto nella eseguibile (avrebbe funzionato, tutte le macchine si suppone per funzionare su sono identici). Purtroppo sembra come se LD_LIBRARY_PATH ha la precedenza sulla rpath (reset LD_LIBRARY_PATH confermato che è in grado di trovare la libreria, ma come detto in precedenza, LD_LIBRARY_PATH sarà impostato per tutti, e non posso cambiare la situazione).

C'è un modo posso fare rpath hanno la precedenza su LD_LIBRARY_PATH, o ci sono altre possibili soluzioni al mio problema? Si noti che sto parlando di collegamento dinamico in fase di esecuzione, sono in grado di controllare la riga di comando in fase di compilazione e di collegamento di tempo.

Grazie.

È stato utile?

Soluzione

Il collegamento contro libstdc++.a è sicuramente possibile, anche se difficile. Istruzioni qui .

Sono un po 'scettico della tua affermazione che LD_LIBRARY_PATH ha la precedenza sul "cotto nel" DT_RPATH però - almeno su Linux e (credo) di Solaris, LD_LIBRARY_PATH è solo guardato dopo ricerca DT_RPATH ha fallito

Altri suggerimenti

Forse si può utilizzare un wrapper shell che modifica l'ambiente solo per questo programma?

#!/bin/sh

LD_LIBRARY_PATH="/path/to/your/lib:${LD_LIBRARY_PATH}"
export LD_LIBRARY_PATH
exec /path/to/binary $@

Questo dovrebbe sovraccaricare il LD_LIBRARY_PATH prima dell'esecuzione e quindi sostituire l'involucro con il binario tramite exec.

Sarebbe questo aiuto?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top