有没有办法在不加载的情况下读取.so文件的内容?

时间:2013-10-16 05:43:06

标签: c++ shared-objects shared-libraries

有没有办法在不加载的情况下读取.SO(共享对象)文件的内容?

我的用例场景是:

  1. 我在Windows上有一个.so文件。我需要查询一些方法,无论它们是否存在于.so中。
  2. 了解.so文件中的所有类。
  3. 鉴于类名需要在此类中找到所有方法。
  4. 注意:我可以轻松地在DLL上执行这些操作。此外,我正在Windows上工作,所以我无法加载.SO文件。

    由于

3 个答案:

答案 0 :(得分:8)

要筛选:readelf -a <file>

要保存输出,请将其转储到文件中。例如,我正在学习Raspberry Pi上的Python RPi.GPIO模块,它存储在/usr/lib/python2.7/dist-packages/RPi中,所以我运行:  readelf -a GPIO.so > ~/gpio.so.out

答案 1 :(得分:4)

您可以使用GNU binutils中包含的工具阅读这些文件。虽然GNU binutils通常安装在Linux系统上,但Windows并非如此。但是,它们在Windows下运行Cygwin或minGW。

资源:

  1. Binutils:http://www.gnu.org/software/binutils/
  2. Cygwin:http://www.cygwin.com/
  3. MinGW:http://www.mingw.org/
  4. MinGW Binutils:http://sourceforge.net/projects/mingw/files/MinGW/Base/binutils/
  5. 请注意,使用MinGW(3.),您不需要Cygwin(2.)并自己编译Binutils(1.)。 Binutils包含在MinGW(3.)中,但你也可以尝试下载MinGW的Binutils部分(4。)。

    此处说明如何使用nmreadelf获取信息: How do I list the symbols in a .so file

    如果要将此功能包含在C ++程序中,您可以合并这些工具的源代码(注意许可证!)或在程序中调用它们。可能你需要一个Cygwin环境来在Windows下编译源代码。

答案 2 :(得分:1)

是Windows操作系统所需的解决方案。我使用了android sdk / ndk中的ndk工具中的nm.exe工具。

我将nm.exe的输出转储到某个文件中,然后使用正则表达式从中提取出所有类和方法。