何らかの理由で自分の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)
このフラグと他のフラグの説明は、マンページで確認できます。--dynamic-linker
実行しようとすると
ld-elf.so.1
毎回分割エラーが発生します。
動的リンカ/インタプリタは位置独立()でコンパイルする必要があり、それ自体は共有-pie
オブジェクトに依存したり、他のインタプリタを使用したりしないでください。
答え2
私のrootfsにはUFSを使用します。
ZFSへの答えはとても簡単なので残念です。たぶんこれが移行の理由だと思うかもしれません。
OSの静的部分がすべて1つのデータセットにある限り、ZFSを作成できます。クローンデータセットを一部のサブディレクトリにマウントし、そこでローダ(または変更する項目)を変更し、そのサブディレクトリをルートとして使用して刑務所を作成します。これはオペレーティングシステムの書き込み中にコピーコピーを提供しますが、変更されたローダを使用します。現場でメインローダーとしてインストールするのと同じです(これは刑務所に関する限り)。
(TrueOSはルートに大規模なデータセットを提供し、/usr
そのような別々のデータセットの/var/*
ポイントを効果的に切り取る方法でこのアプローチを示しています/tmp
。/usr/{obj,src,ports,jails,home}
)
このアプローチは、jail
マニュアルページとマニュアルの第14章に記載されている長いプロセスを排除します。FreeBSDマニュアル刑務所ディレクトリツリーを設定するために使用されるのは、刑務所のルートディレクトリにオペレーティングシステムの完全なコピーを構築することです。 ZFS クローンは、実際のルートデータセットをソースとして使用する高速書き込み中のコピーです。