如果庫定義了同一個符號的多個版本,dlsym(RTLD_NEXT, "symbol")
即使舊符號不是默認符號,也會返回舊符號。dlsym(RTLD_NEXT,「msgctl」)不會返回默認版本
例如,定義的libpthread的調用pthread_cond_broadcast兩個版本:
$:> nm -g /lib64/libpthread-2.15.so|grep pthread_cond_broadcast
000000000000bfc0 T [email protected]@GLIBC_2.3.2
000000000000c310 T [email protected]_2.2.5
- 「GLIBC_2.3.2」 是你的libpthread鏈接時(沒有任何對dlsym參與)獲得默認版本。 (請注意 「@@」,這表示默認的符號)
- 「GLIBC_2.2.5」 是一箇舊版本
現在,如果我使用的dlsym(RTLD_NEXT, 「調用pthread_cond_broadcast」),我總是得到GLIBC_2 .2.5版本而不是GLIBC_2.3.2版本。當然,可以使用dlvsym來獲取默認版本,但如果需要爲大量符號執行此操作,並且它們中的很多具有不同的新舊版本,則會變得複雜。
我明白,RTLD_NEXT不應該總是返回最新的符號來保持兼容性,但爲什麼不返回默認符號?
有沒有人知道背後的理由?
我只是碰到下面的問題就來了: http://stackoverflow.com/questions/12342133/pthread-cond-broadcast-broken-with-dlsym?rq=1 有一個指針: HTTP:/ /blog.fesnel.com/blog/2009/08/25/preloading-with-multiple-symbol-versions/ 其中描述了dlsym總是返回舊的符號,忽略默認(「@@」)版本。所以,我想,除非有人有任何建議,否則任何事情都無法完成。 – 2013-02-24 08:33:23