当前位置: 首页 > 面试题库 >

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

秦锐
2023-03-14
问题内容

使用时,可以通过编程方式从共享库(仅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实用工具


问题答案:

没有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,我个人不太了解。

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



 类似资料:
  • 我想分享一个文件(. pdf,. apk等)使用分享意图,我搜索谷歌,但我只找到共享图像的代码

  • 我想把我的sqlite DB文件上传到DropBox。但在此之前,我需要在代码中获取sqlite Db文件。如何在任何设备上执行此操作?我查看了这个链接,它说用户需要root权限才能访问数据库。 所以简而言之: 如何使用非根设备访问我的sqlite数据库?eg 如果这种方法不可行,我如何将我的应用程序数据库保存在一个可以访问它的地方? 如果我能解释什么,请告诉我。提前谢谢

  • 我需要实现一个函数,该函数获取一个由n个元素和一个数字k组成的数组A作为输入,并返回一个包含大小为k的所有子集的数组(每个子集本身就是一个数组)。 定义函数的类型,并为函数实现至少3个测试(使用assert)。它应该是Javascript/Typescript和functional 例如:FunSubset([1,2,3],2)= 有什么想法吗?

  • 问题内容: 如何从包含证书和私钥的PEM文件中以编程方式获取KeyStore?我试图在HTTPS连接中向服务器提供客户端证书。我已经确认,如果我使用openssl和keytool来获取jks文件(该文件是动态加载的),则客户端证书可以使用。我什至可以通过动态读取p12(PKCS12)文件来使其工作。 我正在考虑使用BouncyCastle的PEMReader类,但无法克服一些错误。我正在使用-Dj

  • 在 Python 中,我们使用 def 语句来定义函数,比如: def double(x): return 2 * x 除了用上面的方式定义函数,Python 还提供了一个关键字 lambda,让我们可以创建一个匿名函数,也就是没有名称的函数。它的形式如下: lambda 参数: 表达式 关键字 lambda 说明它是一个匿名函数,冒号 : 前面的变量是该匿名函数的参数,冒号后面是函数的返

  • 问题内容: 有没有办法在Kubernetes中以编程方式获取容器所属的Pod的名称?如果可以,怎么办?我正在使用fabric8的Java客户端,但是curl或类似的东西也可以。 请注意,我不想使用特定的标签来查找容器,否则(我假设)如果使用复制控制器进行缩放,则可能无法始终找到正确的容器。 问题答案: 您可以使用向下API告诉Kubernetes将pod名称放入您选择的环境变量中。 例如: