Bagaimana cara mempertahankan stack glibc / gcc / ... yang terpisah (lebih baru) sebagai non-root di Linux

10

Cluster komputasi kami menjalankan versi CentOS yang sangat lama, dengan Kernel lama (2.6.18) dan, tentu saja, lib dan binari yang lama. Karena memperbarui semuanya memerlukan banyak pekerjaan pada semua node, ini bukan pilihan.

Saya mencoba mengkompilasi dan menggunakan program yang membutuhkan C++11dan karenanya versi gcc(dan / atau clang) yang lebih baru. Karena saya tidak ingin dipusingkan dengan sistem sama sekali, saya ingin melakukan ini sebagai pengguna non-root di beberapa pohon direktori lokal.

Masalahnya adalah, yang gccmembutuhkan yang lebih baru glibcdari yang ada pada mesin. Oleh karena itu, saya perlu mempertahankan versi terpisah yang lebih baru glibcdi lib/pohon lokal saya , mungkin seperti yang dijelaskan di sini .

Di mana saya tersesat, bagaimana cara "menyandikan" jalur lib lokal saya ke semua binari yang diperlukan, yaitu gcc,, g++dll.? Mengatur LD_LIBRARY_PATH ke lib/pohon lokal saya menyebabkan semua biner sistem tidak berfungsi lagi ( ELF file OS ABI invalid) karena mereka ingin menggunakan yang baru libm.so/ libc.soyang tidak dikompilasi.

Jadi, untuk menyelesaikannya: Apa cara yang tepat untuk mempertahankan tumpukan pengembangan lokal yang lebih baru (berisi glibc, gccdll.) Secara paralel dengan sistem lama tanpa dipusingkan sebagai root?

Sebagai pertanyaan sampingan: Mengatur LD_LIBRARY_PATH diposkan sebagai solusi di seluruh SE saat akan terpisah glibc. Bagi saya, itu menyebabkan kesalahan di atas ketika saya mencoba menjalankan sistem biner (seperti ls). Bagaimana bisa? Apakah saya melakukan sesuatu yang salah atau apakah ini perilaku yang dimaksudkan?

janoliver
sumber

Jawaban:

10

Pada dasarnya Anda memiliki tiga opsi:

  1. Gunakan pembungkus di sekitar perpustakaan Anda, yang akan mengatur dengan LD_LIBRARY_PATHtepat dan kemudian jalankan perpustakaan yang diinginkan - sesuatu seperti:

    #!/bin/sh
    export LD_LIBRARY_PATH="path/goes/here"
    exec "$@"
    
  2. tautan dengan -rpath( -Wl,rpath) yang menambahkan jalur pencarian untuk tautan dinamis ke dalam biner (lihat juga SO jawaban - itu juga menyebutkan pembungkus).

  3. Anda tidak akan suka membaca ini: perbarui cluster Anda (perhatikan penekanan pada "Anda"). Itu harus dilakukan satu hari atau yang lain, jadi mengapa tidak hari ini. "Bukan opsi" agak kuat dalam banyak kasus. Pengguna lain mungkin memiliki masalah yang sama.

Adapun binari lama mengalami masalah - biner memiliki linker dinamis pilihan mereka tertanam di dalamnya. Dan tautan dinamis lama tidak memahami ABI yang lebih baru. Mencoba menelepon binari seperti ini: path/to/your/ld-linux-<arch>.so binary.

Membangun GCC: Anda selalu dapat mencoba mengekspor CFLAGSdi lingkungan build GCC - tapi saya yakin mereka akan diperbanyak. Skrip Build dari berbagai distribusi dapat memberi Anda beberapa petunjuk (misalnya: untuk openSUSE, lihat baris 1880 di file .spec ).

peterph
sumber
Hai peterph, terima kasih atas jawabannya. Saya lebih suka opsi 2. Namun, bagaimana cara saya meng-hardcode rpath ke, misalnya, gcc, tanpa harus mengubah Makefile dll? Adapun memperbarui cluster: Ini tentu saja ada di agenda kami, tetapi saat ini terlalu banyak orang menggunakannya untuk membenarkan downtime yang lebih lama. Juga, untuk memperbaruinya kita akan menyewa perusahaan lagi yang mengaturnya semula. Tidak ada seorang pun di grup kami yang memiliki pengetahuan dan pengalaman yang cukup untuk ini.
janoliver
Untuk GCC lihat pembaruan jawaban saya. Untuk peningkatan cluster, rekomendasi pribadi saya adalah untuk mendapatkan guru internal (atau setidaknya eksternal jangka panjang). Ini biasanya lebih murah dan lebih fleksibel dalam jangka panjang daripada hanya outsourcing sepenuhnya. Keuntungan paling penting adalah mendapatkan pengetahuan di rumah melalui interaksi antara admin sistem dan pengguna.
peterph
Sebagai kelompok riset kecil dalam sistem ilmiah Jerman yang sangat kekurangan dana, kami sayangnya tidak dapat mempekerjakan seseorang untuk tugas ini atau menginvestasikan waktu kami sendiri. Anda mungkin benar, bahwa dalam jangka panjang ini mungkin membuahkan hasil, tetapi saat ini anggaran terlalu terbatas untuk hal seperti ini. Ini adalah kelemahan dari tidak berada di perusahaan. ;)
janoliver
Dapatkan siswa IT / CS dari universitas Anda - yang bagus bahkan mungkin dapat menggunakannya untuk tesis BSc / Msc-nya. Dan mengenai keuangan: senanglah Anda berada di Jerman dan bukan di salah satu tetangga timur Anda (mungkin dengan pengecualian Austria). :)
peterph
Sebagai alternatif untuk meneruskan -rpath( -Wl,rpath) ke linker, linker juga akan menambahkan path dari LD_RUN_PATHvariabel environment ke path pencarian
rakslice