
何らかの理由で、私は自分のバージョンの 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_binary
Linux と同様に、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 クローンとは、実際のルート データセットを元にして、高速なコピー オン ライトを行うものです。