如何在 Linux 上以非 root 使用者身份維護一個單獨的(較新的)glibc / gcc / … 堆棧
我們的計算集群執行一個非常舊版本的 CentOS,帶有一個舊核心(2.6.18),當然還有舊的庫和二進製文件。因為更新整個事情需要在所有節點上進行大量工作,所以這不是一個選擇。
我正在嘗試編譯和使用需要(和/或)
C++11
更新版本的程序。因為我根本不想弄亂系統,所以我想在某個本地目錄樹中以非 root 使用者身份執行此操作。gcc``clang
問題是,這
gcc
需要glibc
比機器上現有的更新。因此,我需要glibc
在我的本地lib/
樹中維護一個單獨的更新版本,可能如此處所述。我迷路的地方是,我如何將本地庫的路徑“硬編碼”到所有必需的二進製文件中,即
gcc
,g++
等等?將 LD_LIBRARY_PATH 設置為我的本地lib/
樹會導致所有系統二進製文件不再工作(ELF file OS ABI invalid
),因為他們想使用我尚未編譯的新libm.so
/ 。libc.so
所以,總結一下:什麼是維護更新的本地開發堆棧(包含等)與舊系統並行而不以 root 身份亂搞的正確
glibc
方法gcc
?作為一個附帶問題:設置 LD_LIBRARY_PATH 在 SE 中作為解決方案發佈時,涉及到單獨
glibc
的 .ls
對我來說,當我嘗試執行任何系統二進製文件(如)時,它會導致上述錯誤。怎麼會?我做錯了什麼還是這是預期的行為?
你基本上有三個選擇:
- 在您的庫周圍使用包裝器,該包裝器將進
LD_LIBRARY_PATH
行適當設置,然後執行所需的庫 - 例如:#!/bin/sh export LD_LIBRARY_PATH="path/goes/here" exec "$@"
- 與
-rpath
(-Wl,rpath
) 連結,它將動態連結器的搜尋路徑添加到二進製文件中(另請參見SO 答案- 它還提到了包裝器)。- 你不會喜歡閱讀這篇文章:更新你的集群(注意強調“你的”)。它必須有一天或另一天完成,所以為什麼不今天。*在大多數情況下, “不是選項”*有點強。其他使用者可能也有同樣的問題。
至於有問題的舊二進製文件 - 二進製文件中嵌入了它們首選的動態連結器。舊的動態連結器不理解新的 ABI。嘗試像這樣呼叫二進製文件:
path/to/your/ld-linux-<arch>.so binary
.建構 GCC:您始終可以嘗試
CFLAGS
在 GCC 的建構環境中導出 - 但我確信它們會被傳播。各種發行版的建構腳本可能會給您一些線索(例如:對於 openSUSE,請查看.spec 文件中的第 1880 行)。