当我使用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头,你应该能够迭代一个导出符号列表(动态符号表),首先找到类型为PT_DYNAMIC的Elf * _Phdr,然后找到DT_SYMTAB,DT_STRTAB条目,并迭代所有符号.动态符号表.使用/usr/include/elf.h指导您.
另外,你可以使用libelf,我个人不太了解.
但请注意,您将获得已定义函数的列表,但您不知道如何调用它们.