Android NDK代码中的SIGILL

tma*_*dry 10 c++ assembly android arm android-ndk

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

  • 我的应用程序被编译为armeabi-v7a, NEON支持.
  • 它在NVIDIA Tegra 2处理器上崩溃,这是ARM-7(Cortex-A9).
  • 它每次都会发生.(联系用户)
  • 崩溃地址是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>
Run Code Online (Sandbox Code Playgroud)

这里有完整的源代码和汇编程序(很简单,基本上是2行C++.)

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

会发生什么事?地址是否在指令中间的事实是否指向某处的损坏指针?(请注意,回溯非常有意义,所以它并不像这个功能在某种程度上被意外调用.)或者它是否是别的东西?

Jay*_*ik- 16

好吧,我明白了:NVIDIA Tegra 2只有16个64位GPU寄存器,因此要定位它,你必须使用-mfpu=vfpv3-d16.有问题的指令使用寄存器d16,这是"太多".:(

以下是对NVIDIA论坛的引用,其中员工提及此限制:http://developer.nvidia.com/tegra/forum/optimal-performance-guidelines

  • 实际上我之前几乎已经提到了Debian ARMEL项目的网站,但他们声称"vfpv3-d16"是一个很好的"共同点".另外(相同的参考),softfp允许编译器"根据所选的FPU类型做出关于何时以及是否根据所选FPU类型生成模拟或实际FPU指令的明智选择",所以它似乎是:您将能够利用FPU与那面旗帜.http://wiki.debian.org/ArmHardFloatPort/VfpComparison (5认同)