如何确定 Android .so 文件的 ABI(即 armeabi 或 armeabi-v7a)?

den*_*rsc 6 android android-ndk

我有一个由第三方供应商提供的 .so 文件,该文件将包含在我的 Android 应用程序中。我无权访问源代码,也无法(轻松)联系供应商。

我有没有办法通过检查 .so 文件来确定它是否是针对armeabiarmeabi-v7a ABI编译的?

我问有两个原因。首先,我更喜欢针对 armeabi-v7a ABI 编译它,以获得比 armeabi 更高的性能;知道这会让我有信心获得最佳性能。另外,我想适当地命名 .so 文件所在的目录(即,将文件夹命名为“armeabi”或“armeabi-v7a”,与它编译的目标 ABI 相对应)。

imc*_*par 5

Android SDK 中的 readelf 应该更容易解决这样的问题:

PATH可能会根据您自己的平台更改):sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-readelf

$ arm-linux-androideabi-readelf -A liba.so
Attribute Section: aeabi
File Attributes
  Tag_CPU_name: "5TE"
  Tag_CPU_arch: v5TE
  Tag_ARM_ISA_use: Yes
  Tag_THUMB_ISA_use: Thumb-1
  Tag_FP_arch: VFPv2
  Tag_ABI_PCS_wchar_t: 4
  Tag_ABI_FP_denormal: Needed
  Tag_ABI_FP_exceptions: Needed
  Tag_ABI_FP_number_model: IEEE 754
  Tag_ABI_align_needed: 8-byte
  Tag_ABI_enum_size: int
  Tag_ABI_optimization_goals: Aggressive Speed
  Tag_DIV_use: Not allowed
Run Code Online (Sandbox Code Playgroud)


den*_*rsc 2

我最终使用arm-linux-androideabi-objdumpAndroid NDK 中的程序反汇编了 .so 文件。在反汇编代码中我找到了该vmaxnm.f32指令,该指令存在于armeabi-v7a指令集中,但不在armeabi中。基于此,我得出结论,.so 是针对armeabi-v7a 编译的。我可能还可以寻找其他指令,但我对 ARM 指令集并不熟悉,无法判断。我很幸运,这个相当明显(因为它是浮点运算,这是armeabi和armeabi-v7a之间的主要区别之一)。感谢发帖者的想法。

  • 是的,验证该库是否**不是**为arm-v6构建比相反更容易。为了完整起见,应该提到一些奇怪的构建使用arm-v7指令,但仍然是为**armeabi**构建的。他们使用运行时CPU检测并避免可能崩溃的指令(参见http://stackoverflow.com/questions/7679363/android-build-system-neon-and-non-neon-builds)。**libx264** 甚至更进一步:他们尝试发出 **arm-v7** 指令并捕获异常,这样他们就可以决定哪一组指令可用。 (2认同)