2013-03-14 68 views
1

我試圖通過其地址在內存中獲取符號名稱由它的地址符號的更多信息。我使用dlfcn.hint dladdr(void *addr, Dl_info *info)函數來獲取信息:我如何獲得有關在內存

 
typedef struct { 
const char *dli_fname; /* Pathname of shared object that 
              contains address */ 
void  *dli_fbase; /* Address at which shared object 
              is loaded */ 
const char *dli_sname; /* Name of nearest symbol with address 
              lower than addr */ 
void  *dli_saddr; /* Exact address of symbol named 
              in dli_sname */ 
} Dl_info; 

但是這個功能不能找到符號匹配的地址,並設置dli_sname和saddr爲NULL。

我怎樣才能得到符號的名稱或任何其他信息(種類,屬性等)約在這種情況下,符號?

注意:我試圖找到的符號的名稱是_ZTv0_n24_N4QGst13PropertyProbeD0Ev。它在QGst::PropertyProbe類的虛函數表由g++ -fdump-class-hierarchy上市:

 
Vtable for QGst::PropertyProbe 
QGst::PropertyProbe::_ZTVN4QGst13PropertyProbeE: 14u entries 
... 
80 (int (*)(...))QGst::PropertyProbe::_ZTv0_n24_N4QGst13PropertyProbeD1Ev 
... 

但它不是由dladdr通過其地址尋找到共享對象時dlopen和符號_ZTVN4QGst13PropertyProbeEdlsym並通過列表迭代,我已經得到發現的虛擬函數指針。 v表中的所有其他功能可通過dladdr找到。

回答

1

我試圖讓符號名稱由它的地址在內存中。

爲了什麼?

我使用int提供dladdr()...

您需要了解的第一件事情是,dladdr只着眼於ELF形象,這往往遠小於的動態符號表靜態符號表。您可以使用nm -D查看動態符號表的內容。

舉例來說,如果你沒有-Wl,-E-rdynamic標誌鏈路a.out可執行文件,然後main不會出現出現在動態符號表中,從而將「看不見」 dladdr

你需要知道的第二件事是,當你鏈接共享庫,你可以控制什麼符號和不從它那裏得到出口(出口符號是具有動態符號表項的)。有多種方法可以做到這一點:鏈接器版本腳本,-fvisibility標誌,attribute((visibility(...)))

這一切是說,尋找一個符號,dladdr不能告訴你任何事情不應該在所有的令人吃驚。