Linuxでルート以外の別の(最新の)glibc / gcc / ...スタックを保持する方法

Linuxでルート以外の別の(最新の)glibc / gcc / ...スタックを保持する方法

私たちのコンピューティングクラスタは、古いカーネル(2.6.18)ともちろん、古いライブラリとバイナリを含む非常に古いバージョンのCentOSを実行しています。全体を更新するには、すべてのノードで多くの操作が必要なので、これはオプションではありません。

C++11gcc最新バージョン(および/または)が必要なプログラムをコンパイルして使用しようとしていますclang。私はシステムをまったく台無しにしたくないので、いくつかのローカルディレクトリツリーでroot以外のユーザーとしてこれを実行したいと思います。

問題は、これを行うには、すでにシステムにあるよりも新しいものが必要であることですgcc。したがって、前述のように、別々のアップデートバージョンツリーでローカルに別々のアップデートバージョンを維持するglibc必要があります。glibclib/ここ

私が失ったのは、デフォルトのライブラリパスをすべての必須バイナリに「ハードコーディング」する方法ですgccg++LD_LIBRARY_PATHを私のローカルツリーに設定すると、すべてのシステムバイナリが私の新しい/まだコンパイルされたファイルを使用しようとしているので、lib/もう機能しません()。ELF file OS ABI invalidlibm.solibc.so

要約すると、ルートになるのを妨げることなく、古いシステムと並行して新しいローカル開発スタック(インクルードなど)を維持する正しい方法は何ですかglibcgcc

追加の質問として、分離された.またはglibc場合、システムバイナリ(たとえば)を実行しようとすると、ls上記のエラーが発生します。どうですか?私が何か間違っているのですか、それとも予想される動作ですか?

答え1

デフォルトでは3つのオプションがあります。

  1. LD_LIBRARY_PATH適切な設定を行い、必要なライブラリを実行するラッパーをライブラリの周りに使用します。次のようになります。

    #!/bin/sh
    export LD_LIBRARY_PATH="path/goes/here"
    exec "$@"
    
  2. -rpath()接続を使用して、-Wl,rpath動的リンカーの検索パスをバイナリに追加します(参照:だから答えは- 包装紙についても言及されています。)

  3. この記事を読むのは楽しいことではありません:更新あなたのクラスター(「あなたの」に焦点を当てます)。近いうちに完了するので、今日はどうですか?「オプションではありません」ほとんどの場合、少し強いです。他のユーザーも同じ問題を引き起こす可能性があります。

問題の以前のバイナリの場合、バイナリには好みの動的リンカーが組み込まれています。そして、古い動的リンカーは新しいABIを理解していません。次のようにバイナリを呼び出しますpath/to/your/ld-linux-<arch>.so binary

GCCビルド:いつでもGCCビルド環境からエクスポートしようとすることができますが、伝播されると確信していますCFLAGS。さまざまなディストリビューションのビルドスクリプトはいくつかの手がかりを提供できます(例えば、openSUSEの場合は1880行を参照)。.spec ファイル)。

関連情報