Centos

如何在 Linux 上以非 root 使用者身份維護一個單獨的(較新的)glibc / gcc / … 堆棧

  • March 3, 2015

我們的計算集群執行一個非常舊版本的 CentOS,帶有一個舊核心(2.6.18),當然還有舊的庫和二進製文件。因為更新整個事情需要在所有節點上進行大量工作,所以這不是一個選擇。

我正在嘗試編譯和使用需要(和/或)C++11更新版本的程序。因為我根本不想弄亂系統,所以我想在某個本地目錄樹中以非 root 使用者身份執行此操作。gcc``clang

問題是,這gcc需要glibc比機器上現有的更新。因此,我需要glibc在我的本地lib/樹中維護一個單獨的更新版本,可能如此所述。

我迷路的地方是,我如何將本地庫的路徑“硬編碼”到所有必需的二進製文件中,即gccg++等等?將 LD_LIBRARY_PATH 設置為我的本地lib/樹會導致所有系統二進製文件不再工作(ELF file OS ABI invalid),因為他們想使用我尚未編譯的新libm.so/ 。libc.so

所以,總結一下:什麼是維護更新的本地開發堆棧(包含等)與舊系統並行而不以 root 身份亂搞的正確glibc方法gcc

作為一個附帶問題:設置 LD_LIBRARY_PATH 在 SE 中作為解決方案發佈時,涉及到單獨glibc的 . ls對我來說,當我嘗試執行任何系統二進製文件(如)時,它會導致上述錯誤。怎麼會?我做錯了什麼還是這是預期的行為?

你基本上有三個選擇:

  1. 在您的庫周圍使用包裝器,該包裝器將進LD_LIBRARY_PATH​​行適當設置,然後執行所需的庫 - 例如:
#!/bin/sh
export LD_LIBRARY_PATH="path/goes/here"
exec "$@"
  1. -rpath( -Wl,rpath) 連結,它將動態連結器的搜尋路徑添加到二進製文件中(另請參見SO 答案- 它還提到了包裝器)。
  2. 你不會喜歡閱讀這篇文章:更新你的集群(注意強調“你的”)。它必須有一天或另一天完成,所以為什麼不今天。*在大多數情況下, “不是選項”*有點強。其他使用者可能也有同樣的問題。

至於有問題的舊二進製文件 - 二進製文件中嵌入了它們首選的動態連結器。舊的動態連結器不理解新的 ABI。嘗試像這樣呼叫二進製文件:path/to/your/ld-linux-<arch>.so binary.

建構 GCC:您始終可以嘗試CFLAGS在 GCC 的建構環境中導出 - 但我確信它們會被傳播。各種發行版的建構腳本可能會給您一些線索(例如:對於 openSUSE,請查看.spec 文件中的第 1880 行)。

引用自:https://unix.stackexchange.com/questions/132158