Linux では、おそらくdlopen
いくつかの/proc/self/fd/15
ファイルを作成できます (ファイル記述子 15 の場合)。
RTLD_DATA
存在しないようです。したがって、必要に応じて、独自の動的ローダーにパッチを適用する必要があります。おそらく、MUSL Libc内でそれを行うのはそれほど難しくないでしょう。なぜあなたがそれを必要とするのか、私はまだ理解していません。
dlopen
-ed プラグインを何らかの方法で信頼する必要があります (そして、そのコンストラクター関数をそのdlopen
時点で実行します)。
おそらくlibelfまたは( binutilsから) ; dlopen
_ しかし、私はまだあなたがどのような分析をしたいのか理解していません(そして、あなたは本当にそれを説明する必要があります.特に、プラグインが動作の悪いソフトウェアに間接的にリンクされている場合はどうなりますか). つまり、検証手順について詳しく説明する必要があります。共有オブジェクトは自分自身を上書きする可能性があることに注意してください....libbfd
dlopen
または、ファイルだけを使用しないでください (いくつかのELFを解析し、再配置を処理mmap
する必要があります。詳細については、elf(5)および Levine のリンカーとローダーを参照し、GNU glibcなどの のソース コードを調べてください) 。 .ld.so
おそらく、いくつかのJIT生成手法を使用すると便利な場合があります (検証済みのデータからコードをJIT生成します)。
また、同じ共有オブジェクトに対して 2 つのファイル記述子がある場合、おそらく競合状態は発生しません。
オプションは、アドホックの静的 C または C++ ソース コード アナライザーを構築することです (おそらく、提供されたGCC プラグインを使用します)。そのプラグインは (数か月、あるいは数年にわたる開発作業を経て) ユーザーの C++ コードのプロパティをチェックする場合があります。ライスの定理(すべての静的ソース コード アナライザーのプロパティを制限する) に注意してください。次に、あなたのプログラムは (私のmanydl.cのように、または 2020 年半ばにRefPerSysがすぐに行うように、または数年前に廃止されたGCC MELTが行ったように) ユーザーの C++ コードを入力として受け取り、その C++ で静的解析を実行する可能性があります。コード (たとえば、GCC プラグインを使用) を作成し、その C++ コードを一時的な共有オブジェクトにコンパイルし、dlopen
その共有オブジェクトを作成します。ドレッパーの論文を読んでください共有ライブラリの書き方.