brazo corteza a9 cruz compilación extraño comportamiento de punto flotante

Estoy tratando de portar una aplicación más grande desde x86 a armar la corteza a9, pero obtengo fallas de segmentación extrañas con funciones de punto flotante como modf al compilar de forma cruzada la aplicación, otras funciones de libc ++ parecen manejar las flotaciones incorrectas, pero no se bloquean (vea abajo).

Así que probé este pequeño programa de prueba, que también puede provocar el error. La salida del programa de prueba (ver más abajo) debería demostrar mi problema.

#include <iostream>
int main(int argc, char *argv[])
{
    double x = 80;
    double y = 0;
    std::cout << x << "\t" << y << std::endl;
    return 0;
}

compilado en la corteza del brazo a9:

@tegra$ g++ -Wall test.cpp -o test_nativ
@tegra$ ./test_nativ 
80      0

cruz compilado

@x86$ arm-cortex_a9-linux-gnueabi-g++ test.cpp  -o test_cc
@tegra$ ./test_cc
0       1.47895e-309

compilado con la opción de enlazador '-static'.

@x86$ arm-cortex_a9-linux-gnueabi-g++ -static test.cpp  -o test_cc_static
@tegra$ ./test_cc_static 
80      0

.

@x86$ arm-cortex_a9-linux-gnueabi-objdump -S test_cc
see: http://pastebin.com/3kqHHLgQ

@tegra$ objdump -S test_nativ
see: http://pastebin.com/zK35KL4X

.

Para responder algunos de los comentarios a continuación:
- El compilador cruzado está configurado para little endian, al igual que el compilador nativo en la máquina tegra.
- No creo que sea un problema de alineación de la memoria, tuve mi parte de estos mientras realizaba el proceso de armar y estos deberían enviar SIGBUS a la aplicación o iniciar sesión en syslog, consulte la documentación para / proc / cpu / alineación.

Mi solución actual es copiar la herramienta de compilación cruzada y usarla con LD_LIBRARY_PATH ... no está bien, pero es lo suficientemente bueno por el momento.




Editar:
Gracias por sus respuestas.
Mientras tanto, descubrí que la distribución de Linux en el dispositivo tegra se compilaba con '-mfloat-abi = softfp', aunque la documentación indicaba que se requiere una cadena de herramientas compilada con '-mfloat-abi = hard'.
Cambiar la cadena de herramientas trajo el éxito.

Parece que la diferencia entre hard y softfp se puede ver usando 'readelf -A' en cualquier binario del sistema:
Si la salida contiene la línea: 'Tag_ABI_VFP_args: VFP registra' se compila con '-mfloat-abi = hard'. Si falta esta línea, lo más probable es que el binario se compile con '-mfloat-abi = softfp'.
La línea 'Tag_ABI_HardFP_use: SP and DP' no indica el compilerflag '-mfloat-abi = hard'.

Respuestas a la pregunta(2)

Su respuesta a la pregunta