以编程方式获取共享库中的函数名称

当我使用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; } 

肮脏的黑客,我知道:使用nmobjdump实用程序

没有libc函数来做到这一点。 但是,您可以自己写一个(或者像readelf这样的工具复制/粘贴代码)。

在Linux上, dlopen()返回一个link_map结构的地址,该结构有一个名为l_addr的成员,指向加载的共享对象的基地址(假设你的系统没有随机化共享库放置,并且你的库没有预链接)。

在Linux上,找到基地址( Elf*_Ehdr的地址)的方法是在dlopen()之后使用dl_iterate_phdr()

具有ELF标头,您应该能够遍历导出符号列表(动态符号表),方法是先查找Elf*_Phdr类型的Elf*_Phdr PT_DYNAMIC ,然后查找DT_SYMTABDT_STRTAB条目,然后遍历所有符号动态符号表。 使用/usr/include/elf.h来指导你。

另外,你可以使用libelf ,我个人不太了解。

但是请注意,您将获得已定义函数的列表,但是您不知道如何调用它们。