2013-02-24 17 views
4

如果庫定義了同一個符號的多個版本,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不應該總是返回最新的符號來保持兼容性,但爲什麼不返回默認符號?

有沒有人知道背後的理由?

+0

我只是碰到下面的問題就來了: 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

回答

2

這已被報告爲glibc的錯誤:

據我所知,還沒有固定的。

+0

'dlsym' malloc/calloc是否安全?我相信 - 否則,'malloc'等不能安全插入。 'dladdr1' m/c/realloc也是安全的嗎?我有一個自定義的dlsym實現,我正在考慮使用'dladdr1'來獲取'struct link_map'。我不能使用它,如果它分配內存出於同樣的原因,我爲什麼不能首先使用dlsym本身。謝謝。 – 2017-11-10 09:42:20

+0

如果成功,'dlsym'不會調用'malloc'。當前的glibc實現使用'malloc'來保存發生故障時'dlerror'的錯誤信息。使用'RTLD_NEXT'的插入'malloc'可以有一個後備分配器來處理這種重入問題。 – 2017-11-10 18:00:31

+0

謝謝。當前的glibc實現使用malloc來保存錯誤信息以防止出現錯誤,意味着'dladdr1'是malloc-safe(我特別想知道'dladdr1'是否分配內存)?手冊頁說'如果在addr中指定的地址不能與共享對象相匹配,那麼這些函數返回0.在這種情況下,通過dlerror(3)。錯誤消息是不可用的。「我解釋爲」沒有分配內存」。 – 2017-11-10 18:08:06

0

RTLD_NEXT的整點是在第一個默認值之後返回符號。你不只是在尋找RTLD_DEFAULT

+1

我已經預裝了一個庫,可以在某些符號周圍放置包裝。爲了調用libc版本,它使用dlsym(RDLD_NEXT,...) – 2013-02-24 08:36:34