アップグレード不可能な Linux カーネルが実行されている ARM デバイスがあります。その上でいくつかの C++11 プログラムを実行したいのですが、システムlibstdc++.so.6
がlibc.so.6
古すぎて実行時に C++11 をサポートできません。新しいライブラリのコピーを持っていますが、古いライブラリではなく新しいライブラリを使用するようプログラムに指示する方法がわかりません。という新しいディレクトリを作成し/tmp/newlibs
、新しい共有オブジェクトのコピーをそこに置きました。次に、次のフラグでコンパイルしました。
g++ -std=c++11 -Wl,-rpath,/tmp/newlibs test.cpp -o test
しかし、ファイルを実行しようとすると、次のエラーが発生します。
/test: /lib/libc.so.6: version `GLIBC_2.17' not found (required by /tmp/newlibs/libstdc++.so.6)
明らかに、rpath
フラグはlibstdc++
では機能しましたが、 の新しいバージョンでは機能しなかったようですlibc.so.6
。私がここに欠けているものはありますか?libstdc++.so.6
変更できないハードコードされたパスがありますか?
これはこの質問と非常によく似た問題だと思いますが、私の場合、新しい glibc ディレクトリを十分に活用していません。
編集: 何らかの理由で動的リンカーが新しい libc をスキップしているようです。libc.so.6
を使用してプリロードしようとするとLD_PRELOAD
、次のようになるためです。
ERROR: ld.so: object '/tmp/newlibs/libc.so.6' from LD_PRELOAD cannot be preloaded: ignored.