FreeBSD テスト rtld

FreeBSD テスト rtld

何らかの理由で、私は自分のバージョンの rtld (ld-elf.so.1) を変更してテストしようとしています。このリンカーに変更を加えた後は、システムを再起動し、CD/DVD から起動し、/libexec/ に自分のバージョンをインストールして、もう一度システムを再起動する必要があります。セグメンテーション エラーのため、ユーザー スペースが実行されないこともあります。このような手順で多くの時間を無駄にしています。

/libexec に rtld を再インストールしてシステムを再起動せずに、コマンド ラインからこのリンカーを起動するにはどうすればよいか教えてください。Linux /lib/ld-linux.so.2 と同様に rtld を実行することは可能ですか?

ld-elf.so.1 を実行しようとしましたが、毎回セグメンテーション違反が発生します。おそらく、rtld コマンドラインでいくつかのパラメータが抜けているのでしょう。コマンドラインから rtld を実行する方法について何かアドバイスはありますか?

実行可能ファイルのデフォルトのインタープリターを変更できるでしょうか?

編集: rootfs のファイルシステムとして UFS を使用します。

答え1

Linux と同様に rtld を実行することは可能ですか/lib/ld-linux.so.2?

はい、/libexec/ld-elf.so.1 /path/to/your_binaryLinux と同様に、FreeBSD でも問題なく動作します。

実行可能ファイルのデフォルトのインタープリターを変更できるでしょうか?

はい、バイナリをコンパイルするときに を介してそれを実行できますcc -Wl,-dynamic-linker=/path/to/your_interpreter。 は、-Wl,..gcc/clang がリンカーに引数を直接渡す方法です。およびその他のフラグld(1)の説明については、man ページを参照してください。--dynamic-linker

実行しようとしましたld-elf.so.1が、毎回セグメンテーション違反が発生します。

動的リンカー/インタープリターは位置独立 ( -pie) としてコンパイルする必要があり、それ自体が共有オブジェクトに依存したり、別のインタープリターを使用したりすることはできません。

答え2

私のルートファイルシステムには UFS を使用します。

それは残念です。ZFS の答えは非常にシンプルだからです。おそらく、これを切り替えの理由として見ることになるでしょう。

オペレーティングシステムの静的部分がすべて1つのデータセット上にある限り、ZFSを作成します。クローンデータセットのサブディレクトリにマウントし、ローダー(または変更したいもの)を変更し、そのサブディレクトリをルートとして jail を作成します。これにより、オペレーティングシステムのコピーオンライトコピーが作成されますが、変更されたローダーが現地でメインローダーとしてインストールした場合(それは刑務所に関する限り)。

(TrueOS は、ルートとに大きなデータセットを用意し、、、などの個別のデータセットのポイントを効果的に削減することで、この方法を示しました/usr。)/var/*/tmp/usr/{obj,src,ports,jails,home}

jailこのアプローチでは、マニュアルページや第14章に記載されている長いプロセスが不要になります。FreeBSD ハンドブック、jail ディレクトリ ツリーを設定するためのもので、jail のルート ディレクトリ内にオペレーティング システムのコピー全体を構築することが含まれます。ZFS クローンとは、実際のルート データセットを元にして、高速なコピー オン ライトを行うものです。

関連情報