5

ライブラリが同じシンボルの複数のバージョンを定義している場合、dlsym(RTLD_NEXT, "symbol")古いシンボルがデフォルトのシンボルではない場合でも、古いシンボルを返します。

たとえば、libpthreadはpthread_cond_broadcastの2つのバージョンを定義します。

$:> nm -g /lib64/libpthread-2.15.so|grep pthread_cond_broadcast
000000000000bfc0 T pthread_cond_broadcast@@GLIBC_2.3.2
000000000000c310 T pthread_cond_broadcast@GLIBC_2.2.5
  • 「GLIBC_2.3.2」は、libpthreadとリンクするときに取得するデフォルトバージョンです(dlsymの関与なし)。(デフォルトの記号を表す「@@」に注意してください)
  • 「GLIBC_2.2.5」は古いバージョンです

ここで、dlsym(RTLD_NEXT、 "pthread_cond_broadcast")を使用すると、GLIBC_2.3.2バージョンではなく、常にGLIBC_2.2.5バージョンを取得します。もちろん、dlvsymを使用してデフォルトバージョンを取得することもできますが、多数のシンボルに対してそれを行う必要があり、それらの多くが異なる新旧バージョンを持っている場合、それは複雑になります。

RTLD_NEXTは、互換性を維持するために常に最新のシンボルを返す必要はないことを理解していますが、デフォルトのシンボルを返さないのはなぜですか?

誰かがこれの背後にある理論的根拠について知っていますか?

4

2 に答える 2

0

の要点はRTLD_NEXT、最初のデフォルトのシンボルの後にシンボルを返すことです。探しているだけじゃないのRTLD_DEFAULT

于 2013-02-24T08:33:04.870 に答える