一尘不染

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

linux

使用时,可以通过编程方式从共享库(仅Linux)中获取所有函数名称的列表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; }

我知道的肮脏骇客:用途nmobjdump实用工具


阅读 270

收藏
2020-06-07

共1个答案

一尘不染

没有libc函数可以做到这一点。但是,您可以自己编写(或从readelf之类的工具复制/粘贴代码)。

在Linux上,dlopen()返回link_map结构的地址,该结构的成员名为l_addr,指向存储的共享库的基址(假设您的系统没有随机分配共享库的位置,并且您的库尚未预链接)。

在Linux上,办法找到基地址(地址Elf*_Ehdr)是使用dl_iterate_phdr()dlopen()荷兰国际集团的库。

有了ELF标头,您应该能够通过首先定位Elf*_Phdrtype
PT_DYNAMIC,然后定位DT_SYMTABDT_STRTAB条目,并迭代动态符号表中的所有符号,来遍历导出的符号列表(动态符号表)。使用/usr/include/elf.h来指导你。

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

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

2020-06-07