LD_PRELOAD和dlopen選項RTLD_DEEPBIND之間的優先級

先說結論:RTLD_DEEPBIND的優先級更高,在符號名發生衝突時,LD_PRELOAD的全局符號介入對於使用RTLD_DEEPBIND標誌位dlopen開的動態連接庫無效。
發現背景:
在使用《在應用程序中替換Linux中Glibc的malloc的四種方法》一文中第3個方法接管程序內存時發現已接管內存總量比top命令看到的虛擬內存值小很多。於是查看/proc/[pid]/smaps查看虛擬內存頁的使用情況(pmap命令也可以)。在進程中使用gdb查看各個內存頁的首地址,轉換爲內存管理結構體發現,有很多內存沒有接管,導致統計結果要比top少。 挑選了一個未接管的內存,通過 gdb 的dump binary memory 的命令存爲磁盤文件,在通過UltralEdit等二進制編輯器大致瀏覽一下,根據內存包含的文本判斷該內存是由某個動態鏈接庫申請和使用的。而該鏈接庫恰恰是通過dlopendlopen(strLibName,RTLD_NOW|RTLD_LOCAL|RTLD_DEEPBIND)方式打開的。

RTLD_DEEPBIND (since glibc 2.3.4) Place the lookup scope of the symbols in this library ahead of the global scope. This means that a self-contained library will use its own symbols in preference to global symbols with the same name contained in libraries that have already been loaded. This flag is not specified in POSIX.1-2001.

記下來就考慮使用LD_PRELOAD方式接管是否可行的問題,經試驗,其優先級低於RTLD_DEEPBIND。
參見:http://stackoverflow.com/questions/13374240/why-ld-preload-doesnt-work-for-one-of-loaded-shared-libraries

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章