Linuxでバイナリをコンパイルするときに、共有オブジェクトを見つける場所を動的ローダーに伝えるRPATHというものがあります。 RPATHについて私が好きなのは、このプロパティを使用して、必要に応じてローダーが実行可能ファイルへの.so
パス$ORIGIN
からそのファイルを検索する特定のファイルを提供できることです。したがって、私のバイナリにRPATHがある場合、$ORIGIN/.
ローダーはそのディレクトリから検索するため、ソフトウェアの展開に役立ちます。
問題があります。ローダー自体をハードコードする必要があるため、すべての依存関係を出荷できるとしても、ローダーが間違っている場合は役に立ちません。 muslローダーを例にとると、ld
or to beなどpatchelf
を使用してインタプリタパスを設定できます./musl-ld.so
。問題は、実行可能ファイルが独自のディレクトリから呼び出される場合にのみ機能することです。を使用すると、$ORIGIN
カーネルは以下を検索します。テキストパスの名前です$ORIGIN/./musl-ld.so
。インタプリタはこれを行うことができますが、カーネルはできないような理由がありますか?そのような制限を修正することはカーネル管理者にとって利益になりますか?これは、システムに信頼性の高いシステムコールインターフェイスがあるため、AppImageなどのハッキングを使用せずにLinuxに移植可能な実行可能ファイルを作成するプロセスを大幅に簡素化します。