Come posso mantenere uno stack glibc / gcc /… separato (più recente) come non root su Linux


10

Il nostro cluster di calcolo esegue una versione molto vecchia di CentOS, con un vecchio kernel (2.6.18) e, naturalmente, vecchie librerie e binari. Poiché l'aggiornamento di tutto richiede molto lavoro su tutti i nodi, questa non è un'opzione.

Sto cercando di compilare e utilizzare un programma che richiede C++11e quindi versioni più recenti di gcc(e / o clang). Dato che non voglio affatto scherzare con il sistema, voglio farlo come utente non root in un albero di directory locale.

Il problema è che gccrichiede una versione più recente glibcdi quella presente sulle macchine. Quindi, devo mantenere una versione separata e più recente del glibcmio lib/albero locale , probabilmente come descritto qui .

Dove mi sono perso è, come faccio a "codificare" i percorsi delle mie librerie locali in tutti i binari richiesti, ad esempio gcc, g++ecc.? L'impostazione di LD_LIBRARY_PATH sul mio lib/albero locale fa sì che tutti i binari di sistema non funzionino più ( ELF file OS ABI invalid) perché vogliono usare il mio nuovo libm.so/ libc.socontro il quale non sono stati compilati.

Quindi, per concludere: qual è il modo corretto di mantenere un nuovo stack di sviluppo locale (contenente glibc, gccecc.) In parallelo a un vecchio sistema senza fare casino come root?

Come domanda a margine: l'impostazione di LD_LIBRARY_PATH viene pubblicata come soluzione in tutta SE quando si tratta di separare glibc. Per me, causa gli errori sopra quando provo ad eseguire qualsiasi binario di sistema (come ls). Come mai? Ho fatto qualcosa di sbagliato o è questo il comportamento previsto?

Risposte:


10

Hai sostanzialmente tre opzioni:

  1. Usa un wrapper attorno alle tue librerie, che verrà impostato in modo LD_LIBRARY_PATHappropriato e quindi eseguirà la libreria desiderata - qualcosa del tipo:

    #!/bin/sh
    export LD_LIBRARY_PATH="path/goes/here"
    exec "$@"
    
  2. link with -rpath( -Wl,rpath) che aggiunge il percorso di ricerca del linker dinamico nel file binario (vedi anche SO answer - menziona anche il wrapper).

  3. Non ti piace leggere questo: aggiorna il tuo cluster (nota l'enfasi sul "tuo"). Dovrà essere fatto un giorno o l'altro, quindi perché non oggi. "Non un'opzione" è un po 'forte nella maggior parte dei casi. Altri utenti probabilmente hanno gli stessi problemi.

Per quanto riguarda i vecchi binari che hanno problemi - i binari hanno il loro linker dinamico preferito incorporato in loro. E il vecchio linker dinamico non capisce il nuovo ABI. Prova a chiamare i binari come questo: path/to/your/ld-linux-<arch>.so binary.

Creazione di GCC: puoi sempre provare a esportare CFLAGSnell'ambiente di costruzione di GCC - ma sono sicuro che si propagano. Gli script di build di varie distribuzioni possono darti alcuni indizi (ad esempio: per openSUSE guardati intorno alla riga 1880 nel file .spec ).


Ciao peterph, grazie per la risposta. Preferisco l'opzione 2. Tuttavia, come dovrei codificare il rpath, ad esempio in gcc, senza dover modificare il Makefile ecc.? Per quanto riguarda l'aggiornamento del cluster: questo ovviamente è nella nostra agenda, ma in questo momento troppe persone lo stanno usando per giustificare tempi di inattività più lunghi. Inoltre, per aggiornarlo, assumeremo nuovamente la società che l'ha creata originariamente. Non c'è nessuno nel nostro gruppo che abbia sufficiente conoscenza ed esperienza per questo.
Janoliver,

Per GCC vedere l'aggiornamento della mia risposta. Per l'aggiornamento del cluster la mia raccomandazione personale è quella di ottenere un guru interno (o almeno esterno a lungo termine). Di solito è più economico e più flessibile a lungo termine che esternalizzarlo completamente. Il vantaggio più importante è riportare la conoscenza a casa attraverso le interazioni tra l'amministratore di sistema e gli utenti.
peterph,

Come piccolo gruppo di ricerca nel sistema scientifico tedesco irrimediabilmente sottofinanziato, sfortunatamente non siamo in grado di assumere qualcuno per questo compito o di investire il tempo da soli. Potresti aver ragione, che a lungo termine questo potrebbe ripagare, ma in questo momento i budget sono troppo limitati per qualcosa del genere. Questo è il rovescio della medaglia di non essere in un'azienda. ;)
Janoliver,

Ottieni studenti IT / CS dalla tua università - uno bravo potrebbe anche essere in grado di usarlo per la sua tesi di laurea. E riguardo alle finanze: sii felice di essere in Germania e non in uno dei tuoi vicini orientali (forse con l'eccezione dell'Austria). :)
peterph

In alternativa al passaggio -rpath( -Wl,rpath) al linker, il linker aggiungerà anche i percorsi dalla LD_RUN_PATHvariabile d'ambiente al percorso di ricerca
rakslice,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.