2012-03-06 61 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源代码这样做),但它不会让代码更容易阅读。再次,我把它作为练习给读者。