libcに静的にリンクされているelfバイナリがあります。私はそのCコードにアクセスできません。OpenOnloadライブラリを使用したいと思います。このライブラリは、ユーザースペースにソケットが実装されているため、標準のlibcバージョンと比較してレイテンシが低くなっています。OpenOnloadは、標準のソケットAPIを実装し、LD_PRELOADを使用してlibcバージョンをオーバーライドします。ただし、このelfバイナリは静的にリンクされているため、OpenOnloadバージョンのソケットAPIを使用することはできません。
次の手順で、このバイナリをOpenOnloadと動的にリンクするように変換できると思います。
- 新しいプログラムヘッダーを追加します:PT_INTERP、PT_DYNAMICおよびPT_LOAD。
- PT_DYNAMICにエントリを追加して、libcとの依存関係を一覧表示します。
- 新しいPT_LOADセクションに必要なlibc関数のPLTスタブを追加します。
- libc関数の既存のバイナリコードを変更して、対応するPLTスタブにジャンプします。
最初のカットとして、3つのPT_LOADセグメントを追加してみました。既存のPT_LOADセグメントヘッダーの後に、新しいセグメントヘッダーが追加されました。また、既存のセグメントのvm_addrは変更されませんでした。既存のセグメントのファイルオフセットは、p_alignに基づいて次に整列されたアドレスに下にシフトされました。新しいPT_LOADセグメントが、ファイルの最後のファイルに追加されました。
ファイルを書き直した後、実行すると、カーネルによって正しくロードされましたが、すぐにセグメント障害が発生しました。
私の質問は次のとおりです。
- vm_addressesを変更せずに、elfバイナリのファイルオフセットをシフトするだけで、バイナリの実行中にエラーが発生する可能性はありますか?
- 私が試みていることをすることは可能ですか?誰かがそれを試みましたか?