Android NDK代码中的SIGILL

我有一个市场上的NDK应用程序,并得到了关于SIGILL信号的本地崩溃报告。 (我使用谷歌的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> 

完整的源代码和汇编程序可以在这里find (它简短,基本上是2行C ++)。

你可以看到0x399cc处于fconstd指令的中间。 根据arm.com这个指令被添加到VFP-v3 ,这应该(我认为)在任何现代处理器中都可用。

可能会发生什么? 这个地址是否在某个指令的中间 ,是否指向了一个损坏的指针呢? (请注意,回溯是非常有意义的,所以不会像这个函数在某种程度上被称为意外)。或者是其他的东西?

Solutions Collecting From Web of "Android NDK代码中的SIGILL"

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

以下是NVIDIA论坛的一个参考,员工提到这个限制: http : //developer.nvidia.com/tegra/forum/optimal-performance-guidelines

尝试将* .so放在名为“externallibs”的文件夹中,然后在armeabi-v7a文件夹中复制并粘贴* .so之后,通过ndk-build构build。 它帮助到我。 其他的解决scheme是如果可能的话去除霓虹灯支持