私がelfをコンパイルするときの「ベストプラクティス」は、私が考えることができる最も古いバージョンのglibcに接続し、最新バージョンと古いバージョンのglibcの両方で実行することです。
つまり、realpathを使用すると、readelf
glibc出力にGLIBC_2.0バージョンとGLIBC_2.3バージョンの両方があることがわかります。 ELFがglibc 2.0/1/2ジョブにあるように、以前のバージョンを使用したいと思います。
しかし、GLIBC_2.3バージョンはリリース後に開発およびアップグレードされていた可能性があり、GLIBC_2.0バージョンはglibc 2.3リリース以降に変更されていないようです。だから私は私のエルフが利用可能な場合はGLIBC_2.3バージョンを使用し、利用できない場合はGLIBC_2.0バージョンに戻ることを望んでいると思います。
可能ですか?それとも何か理解できませんか?
答え1
そのような慣行を呼ぶのはどこか聞いたこともありません。最高慣行。私が考えることができる最も近いのは、ELFマルウェアを見ると、実際に古いバージョンのLinuxカーネルと以前のバージョンのlibcに対してコンパイルされることが多いことです。しかし、これが「ベストプラクティス」と見なされるかどうかは不明です。
LinuxがELF実行ファイルをメモリに保存する方法を考えると、明示的なフォールバックは不可能だと思います。カーネルが行うことは、ELFファイルのさまざまな部分をファイルのPT_LOAD Pheaderに基づいてメモリにマッピングすることだけです。 Linuxはまた、一般的に/lib/ld-linux.so.2
または/lib64/ld-linux-x86-64.so.2
。インタプリタは libc の一部であり、libc.so
他の共有オブジェクトへの動的接続を担当します。
ELFファイルは利用可能な共有オブジェクトに関連付けられているため、明示的なバージョン選択が不可能であると書いています。それはすべてELFインタプリタに依存します。