当我使用dl_open()
时, dl_open()
编程方式从共享库(仅Linux)获取所有函数名的列表?
我想要这样的东西:
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
实用程序
没有libc函数来做到这一点。 但是,您可以自己写一个(或者像readelf这样的工具复制/粘贴代码)。
在Linux上, dlopen()
返回一个link_map
结构的地址,该结构有一个名为l_addr
的成员,指向加载的共享对象的基地址(假设你的系统没有随机化共享库放置,并且你的库没有预链接)。
在Linux上,找到基地址( Elf*_Ehdr
的地址)的方法是在dlopen()
之后使用dl_iterate_phdr()
。
具有ELF标头,您应该能够遍历导出符号列表(动态符号表),方法是先查找Elf*_Phdr
类型的Elf*_Phdr
PT_DYNAMIC
,然后查找DT_SYMTAB
, DT_STRTAB
条目,然后遍历所有符号动态符号表。 使用/usr/include/elf.h
来指导你。
另外,你可以使用libelf ,我个人不太了解。
但是请注意,您将获得已定义函数的列表,但是您不知道如何调用它们。