使用时,可以通过编程方式从共享库(仅Linux)中获取所有函数名称的列表dl_open()吗?
dl_open()
我想要这样的东西:
std::vector<std::string> list_all_functions(void *dl) { //... what can I do here? } int main() { void * dl = dl_open("./mylib.so", RTLD_NOW); auto functions = list_all_functions(dl); //... dl_close(dl); return 0; }
示例库(mylib.so)
标头(.h):
extern "C" { int sum (int a, int b); }
来源(.c):
int sum (int a, int b) { return a + b; }
我知道的肮脏骇客:用途nm或objdump实用工具
nm
objdump
没有libc函数可以做到这一点。但是,您可以自己编写(或从readelf之类的工具复制/粘贴代码)。
在Linux上,dlopen()返回link_map结构的地址,该结构的成员名为l_addr,指向存储的共享库的基址(假设您的系统没有随机分配共享库的位置,并且您的库尚未预链接)。
dlopen()
link_map
l_addr
在Linux上,办法找到基地址(地址Elf*_Ehdr)是使用dl_iterate_phdr()后dlopen()荷兰国际集团的库。
Elf*_Ehdr
dl_iterate_phdr()
有了ELF标头,您应该能够通过首先定位Elf*_Phdrtype PT_DYNAMIC,然后定位DT_SYMTAB,DT_STRTAB条目,并迭代动态符号表中的所有符号,来遍历导出的符号列表(动态符号表)。使用/usr/include/elf.h来指导你。
Elf*_Phdr
PT_DYNAMIC
DT_SYMTAB
DT_STRTAB
/usr/include/elf.h
另外,您可以使用libelf,我个人不太了解。
但是,请注意,您将获得已定义函数的列表,但不知道如何调用它们。