私たちのコンピューティングクラスタは、古いカーネル(2.6.18)ともちろん、古いライブラリとバイナリを含む非常に古いバージョンのCentOSを実行しています。全体を更新するには、すべてのノードで多くの操作が必要なので、これはオプションではありません。
C++11
gcc
最新バージョン(および/または)が必要なプログラムをコンパイルして使用しようとしていますclang
。私はシステムをまったく台無しにしたくないので、いくつかのローカルディレクトリツリーでroot以外のユーザーとしてこれを実行したいと思います。
問題は、これを行うには、すでにシステムにあるよりも新しいものが必要であることですgcc
。したがって、前述のように、別々のアップデートバージョンツリーでローカルに別々のアップデートバージョンを維持するglibc
必要があります。glibc
lib/
ここ。
私が失ったのは、デフォルトのライブラリパスをすべての必須バイナリに「ハードコーディング」する方法ですgcc
。g++
LD_LIBRARY_PATHを私のローカルツリーに設定すると、すべてのシステムバイナリが私の新しい/まだコンパイルされたファイルを使用しようとしているので、lib/
もう機能しません()。ELF file OS ABI invalid
libm.so
libc.so
要約すると、ルートになるのを妨げることなく、古いシステムと並行して新しいローカル開発スタック(インクルードなど)を維持する正しい方法は何ですかglibc
?gcc
追加の質問として、分離された.またはglibc
場合、システムバイナリ(たとえば)を実行しようとすると、ls
上記のエラーが発生します。どうですか?私が何か間違っているのですか、それとも予想される動作ですか?
答え1
デフォルトでは3つのオプションがあります。
LD_LIBRARY_PATH
適切な設定を行い、必要なライブラリを実行するラッパーをライブラリの周りに使用します。次のようになります。#!/bin/sh export LD_LIBRARY_PATH="path/goes/here" exec "$@"
-rpath
()接続を使用して、-Wl,rpath
動的リンカーの検索パスをバイナリに追加します(参照:だから答えは- 包装紙についても言及されています。)この記事を読むのは楽しいことではありません:更新あなたのクラスター(「あなたの」に焦点を当てます)。近いうちに完了するので、今日はどうですか?「オプションではありません」ほとんどの場合、少し強いです。他のユーザーも同じ問題を引き起こす可能性があります。
問題の以前のバイナリの場合、バイナリには好みの動的リンカーが組み込まれています。そして、古い動的リンカーは新しいABIを理解していません。次のようにバイナリを呼び出しますpath/to/your/ld-linux-<arch>.so binary
。
GCCビルド:いつでもGCCビルド環境からエクスポートしようとすることができますが、伝播されると確信していますCFLAGS
。さまざまなディストリビューションのビルドスクリプトはいくつかの手がかりを提供できます(例えば、openSUSEの場合は1880行を参照)。.spec ファイル)。