Кортекс руки 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".