Кортекс руки A9 кросс-компиляция странное поведение с плавающей запятой

Я пытаюсь портировать более крупное приложение с x86 на вооружение кортекса a9, но я получаю странные ошибки сегментации с функциями с плавающей запятой, такими как modf, при кросс-компиляции приложения, другие функции libc ++, похоже, просто обрабатывают плавающие объекты неправильно, но не дают сбоя (увидеть ниже).

Поэтому я попробовал эту небольшую тестовую программу, которая также может вызвать ошибку. Вывод тестовой программы (см. Ниже) должен продемонстрировать мою проблему.

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

составлено на руку кору а9:

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

кросс составлен

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

крест, составленный с помощью "-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

.

Чтобы ответить на некоторые комментарии ниже:
- Кросс-компилятор настроен для little-endian, как и нативный компилятор на машине Tegra.
- Я не верю, что это проблема выравнивания памяти, у меня была их доля при переносе на arm, и они должны были посылать SIGBUS в приложение или регистрироваться в syslog, см. Документацию для / proc / cpu / alignment.

Мой текущий обходной путь - скопировать кросс-скомпилированный набор инструментов и использовать его с LD_LIBRARY_PATH ... не очень хорошо, но пока достаточно хорошо.




Редактировать:
Спасибо за ответ.
Тем временем я узнал, что дистрибутив linux на устройстве tegra был скомпилирован с помощью '-mfloat-abi = softfp' хотя в документации указано, что набор инструментов скомпилирован с помощью -mfloat-abi = hard & apos; необходимо.
Смена набора инструментов принесла успех.

Кажется, что разницу между hard и softfp можно увидеть с помощью 'readelf -A'; в любой системе двоичный:
Если выходные данные содержат строку: «Tag_ABI_VFP_args: регистры VFP»; он компилируется с «-mfloat-abi = hard». Если эта строка отсутствует, двоичный файл, скорее всего, компилируется с помощью '-mfloat-abi = softfp'.
Строка «Tag_ABI_HardFP_use: SP и DP»; не указывает флаг компилятора "-mfloat-abi = hard".

Ответы на вопрос(2)

Ваш ответ на вопрос