在运行时获取可用的库函数
Get available library functions at runtime
我正在使用windows上的动态链接库(.dll
)或Linux上的共享对象(.so
)。
我的目标是编写一些代码,这些代码可以给出库在磁盘上的绝对路径,返回该库的所有导出函数(导出表)的列表,并最终能够调用这些函数。这应该适用于windows(wit dll)和Linux(有so)。
我正在编写一种包装器,delgates函数将其调用到相应的库。因此,我收到一个路径、一个函数名和一个参数列表,然后我想转发这些参数。问题是:在尝试调用之前,我想知道给定的函数是否存在
从这里,我找到了一种独立于平台的方法来打开和关闭库,并获得指向具有给定名称的函数的指针
所以剩下的就是首先获取可用函数的名称。
在这个主题上,我发现这个问题处理的问题与它要求特定于Linux的解决方案的问题相同。在给定的答案中,它被称为
没有libc函数可以做到这一点。但是,您可以自己编写代码(或者从readelf这样的工具复制/粘贴代码)。
这清楚地表明有工具可以做我正在寻找的事情。唯一的问题是,有没有一个可以在windows和Linux上工作?如果没有,我该如何独自完成这件事?
这里有一个C#实现(实际上这是我想移植到C++的代码),它正在做我想做的事情(尽管只是windows)。对我来说,这看起来就像是手动处理库结构。如果是这样的话,我在哪里可以找到关于图书馆结构的必要信息?
因此,在unixoids上(Linux和WinNT都有posix子系统),dlopen
函数可以用于加载动态库,并根据符号名称获取指向已知符号的函数指针。
据我所知,获取符号列表从来都不是POSIX费心指定的一个方面,长话短说,在Linux上可以为您实现这一点的函数是特定于那里使用的libc(主要是GNU libc),在Windows上则是特定于在那里使用的libc。可移植代码意味着为两个不同的libc使用不同的代码库!
如果你不想依赖libc,你必须有一个二进制对象解析器(适用于Linux上的ELF共享库,Windows上的PE)来从文件中读取符号名。实际上有很多这样的链接器——很明显,WINE有一个可移植的PE链接器(尤其适用于Linux),Linux下的每个链接器(包括glibc的运行时链接器)都可以解析ELF文件。
就我个人而言,radare2是一个很好的反向工程框架,具有大量的语言绑定,实际上是为了分析二进制文件,并为您提供导出的符号(以及能够提取未导出的函数、构建调用图等)。它确实有调试器,也就是说,也有跳转到函数的功能。
所以,现在知道
我正在编写一种包装器,delgates函数将其调用到相应的库。因此,我收到一个路径、一个函数名和一个参数列表,然后我想转发这些参数。问题是:在尝试调用之前,我想知道给定的函数是否存在
事情变得容易多了:实际上不需要获得导出列表。简单的尝试更容易,也同样快速。
因此,在任何POSIX系统(包括Windows的POSIX子系统和Linux)上,dlopen
将打开库并加载符号表,dlsym
将从该表中查找符号。如果该符号不在表中,它只返回NULL
。所以,你已经拥有了你认为需要的所有桌子;只是不明确,但可查询。
- 如何在函数运行时逐个显示列表项
- 动态加载库和运行时误解的显式链接
- 在函数运行时停止 Wt C++函数
- 在运行时获取可用的库函数
- C 构造函数运行时/编译时间
- 是否可以在析构函数运行时不销毁 obj
- c++类库动态运行时分配
- 调试来自同一代码库的运行时差异
- NTL 库ref_GF2运行时错误
- 参数的可变数量函数运行时错误
- 具有变量参数的函数运行时错误
- C++析构函数运行时错误:无法munmap
- 如何在 MEX 函数运行时制作它 printf?
- C++回调函数运行时错误
- FTDI驱动程序库在运行时失败
- 类型缺失的模板函数(运行时未使用)函数
- Boost库构建-运行时链接和链接选项之间的差异
- 压缩库Windows运行时
- Dll与静态库(MSVC9运行时库选项)
- 如何在每个系统或库函数调用时使 GDB 中断