2012-03-06 60 views
0

我已經打開了一個帶有lt_dlopen的shread庫,並且希望爲那些匹配特定模式(函數的名稱與模式匹配)的導出符號搜索列表。共享庫搜索圖案名稱

有沒有簡單的方法來做到這一點?可以按模式搜索,或者只是獲取所有導出的名稱列表。簡單來說,我的意思是沒有特殊的庫只是爲了加載符號。

主程序和庫是C++,但所有符號將是extern "C"

回答

2

你可以按照配方概述in this article只是,如果你進入我們自己的地址空間中的符號/從你通過dlopen()加載庫要簡單得多:

  1. 的「結構link_map *」你獲得reinterpret_cast<struct link_map*>(dlopen(...)); - 所以不需要解析「你自己的ELF」。請參閱sourcecode for __dlopen()
  2. 您不需要使用ptrace()從您自己的地址空間讀取 - 只需直接投射指針即可。

我會說明第二查找符號表地址:

struct link_map *map = reinterpret_cast<struct link_map*>(dlopen(...)); 
int nchains = 0; 
Elf32_Dyn *dyn = static_cast<Elf32_Dyn*>(map->l_ld); 
Elf32_Sym *symtab = NULL; 
char *strtab = NULL; 

while (dyn->d_tag) { 
    switch (dyn->d_tag) { 
    case DT_HASH: 
     nchains = *static_cast<int*>(dyn->d_un.d_ptr + map->l_addr + 4); 
     break; 
    case DT_SYM: 
     symtab = static_cast<Elf32_Sym*>(dyn->d_un.d_ptr); 
     break; 
    case DT_STR: 
     strtab = static_cast<char*>(dyn->d_un.d_ptr); 
     break; 
    default: 
     break; 
    } 
    dyn++; 
} 

這是一個內存相當於我聯繫到文章中的resolv_tables()功能。將find_sym_in_tables()轉換爲通過您自己的地址空間進行模式搜索的內容僅供讀者參考。

請注意,這是Linux特有的(dlopen()返回struct link_map*)。對於其他系統,只要滿足這個條件,該技術就應該工作(並且他們正在使用ELF)。

編輯:這是32位ELF;如果你使用的是64位,數據類型會改變(我認爲表格大小的變化是Elf64_Sym/Elf64_Dyn和64位整數)。我相信這可以被抽象出來(glibc源代碼這樣做),但它不會讓代碼更容易閱讀。再次,我把它作爲練習給讀者。