16

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

我的用例场景是:

  1. 我在 Windows 上有一个 .so 文件。我需要查询一些方法是否存在于 .so 中。
  2. 了解 .so 文件中的所有类。
  3. 给定一个类名需要找到这个类上的所有方法。

注意:我可以很容易地在 DLL 上做这些事情。我也在 Windows 上工作,所以我无法加载 .SO 文件。

谢谢

4

3 回答 3

21

向屏幕:readelf -a <file>

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

于 2015-03-13T19:41:05.507 回答
5

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

资源:

  1. Binutils:http ://www.gnu.org/software/binutils/
  2. 赛格温:http ://www.cygwin.com/
  3. MinGW: http: //www.mingw.org/
  4. MinGW Binutils:http: //sourceforge.net/projects/mingw/files/MinGW/Base/binutils/

请注意,使用 MinGW (3.),您不需要 Cygwin (2.) 并自己编译 Binutils (1.)。Binutils 包含在 MinGW (3.) 中,但您也可以尝试仅下载 MinGW (4.) 的 Binutils 部分。

此处解释了如何使用nmreadelf获取信息: 如何在 .so 文件中列出符号

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

于 2013-10-16T06:08:46.117 回答
1

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

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

于 2017-02-27T06:05:39.407 回答