【问题标题】:SIGILL in Android NDK codeAndroid NDK 代码中的 SIGILL
【发布时间】:2023-03-25 22:03:02
【问题描述】:

我在市场上有一个 NDK 应用程序,并收到了关于 SIGILL 信号的本机崩溃报告。 (我使用 google breakpad 生成原生崩溃报告。)以下是详细信息:

  • 我的应用是为armeabi-v7a 编译的,带有 NEON 支持。
  • 它在 ARM-7 (Cortex-A9) 的 NVIDIA Tegra 2 处理器上崩溃。
  • 它每次都会发生。 (联系了用户)
  • 崩溃地址为0x399cc,信号为SIGILL,在我的代码中。

寄存器和反汇编:

 r4 = 0x001d50f0    r5 = 0x001d50f0    r6 = 0x598e2a3c    r7 = 0x00000000
 r8 = 0x00000001    r9 = 0x001c22b0   r10 = 0x00000000    fp = 0x81216264
 sp = 0x598e2a18    lr = 0x816399cb    pc = 0x816399cc

0x000399c6 <_ZN8Analyzer15setExpAvgFactorEi+22>:    blx 0x30508
0x000399ca <_ZN8Analyzer15setExpAvgFactorEi+26>:    fconstd d16, #7
0x000399ce <_ZN8Analyzer15setExpAvgFactorEi+30>:    vldr    d17, [pc, #32]  ; 0x399f2 <_ZN8Analyzer15setExpAvgFactorEi+66>

提供完整的源代码和汇编器here(很短,基本上是 2 行 C++。)

您可以看到0x399ccfconstd 指令的中间。根据arm.com,这条指令是在VFP-v3 中添加的,(我认为)应该可以在任何现代处理器中使用。

会发生什么?地址位于指令的中间这一事实是否指向某处损坏的指针? (请注意,回溯非常有意义,所以这个函数并不是偶然被调用的。)或者是别的什么?

【问题讨论】:

标签: android c++ assembly android-ndk arm


【解决方案1】:

在将 *.so 复制并粘贴到 armeabi-v7a 文件夹后,尝试将 *.so 放入名为“externallibs”的文件夹中,并使用它通过 ndk-build 构建。 它帮助到我。 如果可能,另一种解决方案是删除 Neon Support

【讨论】:

    【解决方案2】:

    好的,我明白了:NVIDIA Tegra 2 只有 16 个 64 位 GPU 寄存器,因此要定位它,您必须使用 -mfpu=vfpv3-d16 进行编译。有问题的指令使用寄存器d16,这“太多了”。 :(

    这是对 NVIDIA 论坛的引用,其中一名员工提到了此限制:http://developer.nvidia.com/tegra/forum/optimal-performance-guidelines

    【讨论】:

    • 就是这样。它也不支持 NEON 指令。现在的问题是……假设所有armeabi-v7a 处理器都支持vfpv3-d16 是否安全?是否可以在仍然指定 -mfloat-abi=softfp 的同时利用 FPU(Android 需要?)
    • 我之前实际上几乎包含了对 Debian ARMEL 项目站点的引用,但他们声称“vfpv3-d16”是一个很好的“共同点”。此外(相同的参考),softfp 允许编译器“根据所选的 FPU 类型,对何时以及是否生成模拟或真实 FPU 指令做出明智的选择”,所以看起来是的:您将能够利用 FPU那面旗帜。 wiki.debian.org/ArmHardFloatPort/VfpComparison
    • 只是为了给 Jay 的回答提供一些额外的上下文,NEON 支持要求 32 个 FPU 寄存器(请参阅 $NDK/platforms/android-14/arch-arm/usr/include/machine/cpu- 中的注释)特征.h)。 Tegra 2 是少数具有 ARMv7a 指令集但不支持 NEON 的 ARM 设备之一。是的,ARMv7a 要求使用 VFPv3-D16。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    相关资源
    最近更新 更多