SIGILL en el código Android NDK

Tengo una aplicación NDK en el mercado y obtuvo un informe de falla nativa sobre una señal SIGILL . (Yo uso google breakpad para generar informes de fallos nativos.) Aquí están los detalles:

  • Mi aplicación se compila para armeabi-v7a , con soporte NEON.
  • Se estrelló en un procesador NVIDIA Tegra 2, que es ARM-7 (Cortex-A9).
  • Sucede cada vez. (Contacto con el usuario)
  • La dirección del accidente estaba en 0x399cc , la señal era SIGILL , y está en mi código.

Registros y desmontaje:

  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> 

Fuente completa y ensamblador disponible aquí (es corto, básicamente 2 líneas de C ++.)

Puede ver que 0x399cc está en el centro de la instrucción fconstd . De acuerdo con arm.com esta instrucción se añadió en VFP-v3 , que debería (creo) estar disponible en cualquier procesador moderno.

¿Qué podría estar pasando? ¿El hecho de que la dirección está en el centro de una instrucción apunta a un puntero corrupto en alguna parte? (Tenga en cuenta que el backtrace tiene sentido, por lo que no es como si esta función fuera de alguna manera llamada accidente). ¿O es algo más?

Ok, lo tengo: el NVIDIA Tegra 2 sólo tiene 16 registros de GPU de 64 bits, y por lo tanto, para -mfpu=vfpv3-d16 debe compilar con -mfpu=vfpv3-d16 . La instrucción en cuestión utiliza el registro d16 , que es "demasiados". 🙁

Aquí está una referencia a un foro de NVIDIA donde un empleado menciona esta limitación: http://developer.nvidia.com/tegra/forum/optimal-performance-guidelines

Trate de poner * .so en una carpeta llamada 'externallibs' y usarlo para construir por ndk-build, después de copiar y pegar * .so en la carpeta armeabi-v7a. Me ayuda. Otra solución es quitar el Neon Support si es posible

  • ¿Puedo hacer una aplicación C ++ bastante nativa con Android?
  • Unicode y Android NDK
  • ¿Cuál es el lenguaje de init.rc en android?
  • Generador de números aleatorios comunes de iOS y Android
  • Compatible con la biblioteca de redes C y Java
  • Portar un juego iPhone a Android - Texturas y búferes
  • Cómo construir impulso para android como biblioteca compartida con c + + 11 de apoyo
  • C ++ 11 biblioteca aleatoria en Android JNI
  • Guía: Cómo compilar el programa de CA para Android
  • Código nativo de C / C ++ en una plataforma Android
  • Ndk-build no logra construir la biblioteca de audio Superpowered después de la reciente actualización de NDK
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.