Linux関連の経験があまりないため、質問が正確でない場合はお詫び申し上げます。現在、Linux をゼロから構築しています (ほとんどの場合、linuxfromscratch.org バージョン 7.3 のガイドに従っています)。次の問題に遭遇しました。実行可能ファイルをビルドすると、ELF インタープリターと呼ばれるものへのハードコードされたパスが取得されます。
readelf -l program
のようなものを示しています
[Requesting program interpreter: /lib/ld-linux.so.2]
このライブラリ ld-linux-so.2 が glibc の一部であることを突き止めました。この動作にはあまり満足していません。バイナリが非常に移植しにくくなるためです。/lib/ld-linux.so.2 の場所を変更すると、実行可能ファイルが機能しなくなり、見つかった唯一の「修正」は patchelf を使用することです。 NixOS のユーティリティを使用して、ハードコードされたパスを別のハードコードされたパスに変更します。このため、ld ライブラリの静的バージョンにリンクしたいのですが、そのようなものは生成されません。これが私の質問です。glibc をビルドして ld-linux.so.2 の静的バージョンを生成し、後で実行可能ファイルにリンクする方法を教えてください。この ld ライブラリが何をするのか完全には理解していませんが、これは他の動的ライブラリ (または少なくとも glibc.so) をロードする部分であると思います。実行可能ファイルを動的にリンクしたいのですが、しかし、動的リンカー自体を静的に組み込みたいので、ハードコーディングされたパスに依存しません。または、LD_LIBRARY_PATH、おそらくLD_INTERPRETER_PATHに似た環境変数を使用して、インタープリターへのパスを設定できるようにしたいと考えています。目標は、ディレクトリ構造に関係なく、同じ ABI を使用して任意のプラットフォームで実行されるポータブル バイナリを生成できるようにすることです。
関連する可能性のある背景: Slackware 14 x86 を使用して i686 コンパイラ ツールチェーンを構築しているため、全体としてはすべて x86 のホストとターゲットです。glibc 2.17 と gcc 4.7.x を使用しています。