Wie verwalte ich einen separaten (neueren) glibc / gcc /… -Stack als Nicht-Root unter Linux?

10

In unserem Rechencluster wird eine sehr alte Version von CentOS ausgeführt, mit einem alten Kernel (2.6.18) und natürlich alten Bibliotheken und Binärdateien. Da das Aktualisieren des Ganzen viel Arbeit auf allen Knoten erfordert, ist dies keine Option.

Ich versuche, ein Programm zu kompilieren und zu verwenden, das C++11neuere Versionen von gcc(und / oder clang) erfordert . Da ich überhaupt nicht mit dem System herumspielen möchte, möchte ich dies als Nicht-Root-Benutzer in einem lokalen Verzeichnisbaum tun.

Das Problem ist, dass gcceine neuere glibcals die auf den Computern vorhandene erforderlich ist. Daher muss ich eine separate, neuere Version von glibcin meinem lokalen lib/Baum pflegen , wahrscheinlich wie hier beschrieben .

Wo ich bin , ist verloren, wie kann ich „hard“ die Wege meiner lokalen Libs in alle erforderlichen Binärdateien, dh gcc, g++usw.? Wenn Sie LD_LIBRARY_PATH auf meinen lokalen lib/Baum setzen, funktionieren alle System-Binärdateien nicht mehr ( ELF file OS ABI invalid), da sie mein neues libm.so/ verwenden möchten, für libc.sodas sie nicht kompiliert wurden.

Also, um es zu einpacken: Was ist der richtige Weg , um eine neuere Entwicklung auf lokaler Ebene Stapel (mit zu halten glibc, gccetc.) parallel zu einem alten System ohne als Root Herumspielen?

Als Nebenfrage: Das Festlegen von LD_LIBRARY_PATH wird als Lösung in ganz SE veröffentlicht, wenn es um die Trennung geht glibc. Für mich verursacht es die oben genannten Fehler, wenn ich versuche, eine Systembinärdatei (wie ls) auszuführen . Woher? Habe ich etwas falsch gemacht oder ist das das beabsichtigte Verhalten?

janoliver
quelle

Antworten:

10

Sie haben grundsätzlich drei Möglichkeiten:

  1. Verwenden Sie einen Wrapper um Ihre Bibliotheken, der LD_LIBRARY_PATHentsprechend eingestellt wird, und führen Sie dann die gewünschte Bibliothek aus - etwa:

    #!/bin/sh
    export LD_LIBRARY_PATH="path/goes/here"
    exec "$@"
    
  2. Link mit -rpath( -Wl,rpath), der der Binärdatei einen Suchpfad für einen dynamischen Linker hinzufügt (siehe auch SO-Antwort - es wird auch der Wrapper erwähnt).

  3. Sie werden diesen Artikel nicht gerne lesen: Aktualisieren Sie Ihren Cluster (beachten Sie die Betonung auf "Ihr"). Es muss eines Tages oder eines anderen Tages geschehen, warum also nicht heute? "Keine Option" ist in den meisten Fällen etwas stark. Andere Benutzer haben wahrscheinlich die gleichen Probleme.

Was die alten Binärdateien betrifft, bei denen Probleme auftreten - in Binärdateien ist der bevorzugte dynamische Linker eingebettet. Und der alte dynamische Linker versteht den neueren ABI nicht. Versuchen Sie, die Binärdateien wie folgt aufzurufen : path/to/your/ld-linux-<arch>.so binary.

Erstellen von GCC: Sie können jederzeit versuchen, CFLAGSin die Build-Umgebung des GCC zu exportieren - aber ich bin sicher, dass sie weitergegeben werden. Buildskripte verschiedener Distributionen können Ihnen einige Hinweise geben (z. B. für openSUSE in Zeile 1880 in der .spec-Datei nachsehen ).

Peterph
quelle
Hallo Peterph, danke für die Antwort. Ich bevorzuge Option 2. Wie würde ich den Pfad jedoch beispielsweise in gcc fest codieren, ohne das Makefile usw. ändern zu müssen? Was die Aktualisierung des Clusters betrifft: Dies steht natürlich auf unserer Tagesordnung, aber derzeit verwenden zu viele Leute es, um längere Ausfallzeiten zu rechtfertigen. Um es zu aktualisieren, werden wir das Unternehmen, das es ursprünglich eingerichtet hat, erneut einstellen. In unserer Gruppe gibt es niemanden, der über ausreichende Kenntnisse und Erfahrungen verfügt.
Janoliver
Für GCC siehe Update meiner Antwort. Für ein Cluster-Upgrade empfehle ich persönlich einen internen (oder zumindest langfristigen externen) Guru. Auf längere Sicht ist es normalerweise billiger und flexibler als nur das vollständige Auslagern. Der wichtigste Vorteil besteht darin, das Wissen durch Interaktionen zwischen Systemadministrator und Benutzern nach Hause zu bringen.
Peterph
Als kleine Forschungsgruppe im hoffnungslos unterfinanzierten deutschen Wissenschaftssystem können wir leider niemanden für diese Aufgabe einstellen oder die Zeit selbst investieren. Sie haben vielleicht Recht, dass sich dies auf lange Sicht auszahlt, aber im Moment sind die Budgets für so etwas zu eng. Dies ist der Nachteil, nicht in einem Unternehmen zu sein. ;)
janoliver
Holen Sie sich IT / CS-Studenten von Ihrer Universität - ein guter kann es sogar für seine / ihre BSc / Msc-Arbeit verwenden. Und was die Finanzen betrifft: Seien Sie froh, dass Sie in Deutschland sind und nicht in einem Ihrer östlichen Nachbarn (vielleicht mit Ausnahme von Österreich). :)
Peterph
Als Alternative zur Übergabe -rpath( -Wl,rpath) an den Linker fügt der Linker auch die Pfade von der LD_RUN_PATHUmgebungsvariablen zum Suchpfad hinzu
Rakslice