9

を使用して実行可能ファイルからロードされる Linux 共有ライブラリ foo.so がありますdlopen("foo.so", RTLD_NOW | RTLD_LOCAL)。foo.so から、foo.so で定義されたシンボルを参照する別のライブラリー bar.so を dlopen したいのですが、リンカーがそれらを見つけられません。ロードを行う実行可能ファイルのソースがないため、RTLD_LOCAL を RTLD_GLOBAL に変更できません。foo.so をリンクすると役立つかもしれないと思い-Wl,--export-dynamicましたが、ローカル フラグを dlopen にオーバーライドしません。GCC の新しい属性可視化機能も、答えを提供しているようには見えません。

bar.so の未定義シンボルへの参照を foo.so のそれらの定義に解決するようリンカに指示できる方法はありますか? ? 私が思いつく唯一のことは、foo.so 自体から RTLD_GLOBAL を使用して foo.so を dlopen することです。次に、bar.so を dlopen しますが、これは少し面倒です。ありがとう。

4

2 に答える 2

6

foo.soに対してリンクしbar.soます。

実行可能ファイルdlopen()sfoo.sobar.soロードされます。

または、実行可能ファイルにバイナリ パッチを適用して、呼び出しRTLD_GLOBALのフラグに追加しdlopen()ます。コードは次のようになります

    movl    $2, 4(%esp)       # $2 == RTLD_NOW; RTLD_LOCAL is 0
    movl    $0xNNNNN, (%esp)  # $0xNNNNN == &"foo.so"
    call    dlopen

movl $0x102, 4(%esp)代わりに ( ) にパッチRTLD_GLOBAL == 0x100を当ててください。

編集:
の名前がわかっている場合は、「スタブ」に対してbar.soリンクできます。「本物」がなくてもかまいません。重要なのは、それに依存していることだけです。実行時に、その依存関係はロードされるたびにロードされます。foo.sobar.sobar.sofoo.sobar.sofoo.so

于 2010-07-31T01:15:59.500 に答える