我已经打开了一个带有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源代码这样做),但它不会让代码更容易阅读。再次,我把它作为练习给读者。