2017-01-06 4 views
0

thesequestionsを読んだ後、シンボルの解決順序を制御する方法の詳細を探しています。異なる動的に読み込まれたオブジェクトでシンボルを異なる方法で解決する

私の問題では、主に実行可能ファイルexecがあります。 execは、a.soc.soに動的にリンクします。 a.soは、b.soに動的リンクします。 b.soは、通常c.soによって提供される機能fooを呼び出しますが、この場合もexecによって提供されます。 b.soは、c.soの実装がfooの場合にのみ機能します。

状況の図:

exec  (foo caller and provider) 
    | \ 
a.so | 
    | | 
b.so | (foo caller) 
    |/
c.so  (foo provider) 

私だけa.soのコンパイル/ソースを制御することができ、私はLD_PRELOADexeca.soをリンクします。

私はexecに解決するためにexecfooへの呼び出しを希望の実装、およびb.soのコールはc.soに解決するための実装。異なるオブジェクト内の異なるシンボルルックアップを持つこのタイプのものは可能ですか?

答えて

0

残念ながら、ライブラリごとのシンボル解像度を微調整する方法はありませんので、これを達成する簡単な方法はありません。

fooが実際にあなたがGOTいるの究極的ハックランタイム・パッチの適用とOKしない限り、メインの実行可能ファイルからシンボルは、解像度(中に最も高い優先度を得るためにあなたができることは何がありません(それにだけではなくcopy-relocated)メインの実行中に実装されている場合あなたはそうではありません)。

しかし

  • fooがc.so
  • で実装され、あなたは次の操作を行うことができ、十分な

必死いる場合:迎撃内部

  • のget戻りアドレスをa.so(使用__builtin_return_address
  • b.soの境界に対して
  • 一致して(/proc/self/mapsから得ることができる)
  • 結果に応じて、いずれかRTLD_NEXT

これのに特別な処理(呼び出し側がb.soにある場合)、またはコール転送を行いますコースには明らかな限界があります。 b.soがさらに別のd.soから関数を呼び出すとうまくいき、fooが呼び出されますが、多くの場合十分です。そして、私はこのアプローチが実際に展開されているのを見ました。

+0

「dlsym」でこれをどうすればできますか?私は '' a.so''が '' cs.so''の '' foo''を '' dlsym''でどのように参照できるのかを見ていますが、 '' dlsym''を使って ' 'b.so''それを使用しますか? –

+0

申し訳ありませんが、質問は間違っています。私は答えを更新しました、うまくいけば、それは今より有用です。 – yugr

+0

編集ありがとう!しかし、すべての依存関係は、ダイアグラムでのみ下に移動します( '' a.so''は '' b。'' __builtin_return_address''のトリックは機能しません。また、実際には '' exec''と '' c.so''に '' foo''を別々に実装しています。 GOTの​​ハッキングに関するリソースがありますか(これは私が降りたい道路ではありませんが、私が学びたいことです)? –

関連する問題