c – 以编程方式在共享库中获取函数名称

当我使用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,我个人不太了解.

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

上一篇:c – dlclose不会真正卸载共享对象,无论它被调用多少次


下一篇:c – 用相对路径dlopen错误