我已經打開了一個帶有lt_dlopen
的shread庫,並且希望爲那些匹配特定模式(函數的名稱與模式匹配)的導出符號搜索列表。共享庫搜索圖案名稱
有沒有簡單的方法來做到這一點?可以按模式搜索,或者只是獲取所有導出的名稱列表。簡單來說,我的意思是沒有特殊的庫只是爲了加載符號。
主程序和庫是C++,但所有符號將是extern "C"
。
我已經打開了一個帶有lt_dlopen
的shread庫,並且希望爲那些匹配特定模式(函數的名稱與模式匹配)的導出符號搜索列表。共享庫搜索圖案名稱
有沒有簡單的方法來做到這一點?可以按模式搜索,或者只是獲取所有導出的名稱列表。簡單來說,我的意思是沒有特殊的庫只是爲了加載符號。
主程序和庫是C++,但所有符號將是extern "C"
。
你可以按照配方概述in this article只是,如果你進入我們自己的地址空間中的符號/從你通過dlopen()
加載庫要簡單得多:
reinterpret_cast<struct link_map*>(dlopen(...));
- 所以不需要解析「你自己的ELF」。請參閱sourcecode for __dlopen()
。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源代碼這樣做),但它不會讓代碼更容易閱讀。再次,我把它作爲練習給讀者。