kora ramienia a9 kompilacja krzyżowa dziwne zachowanie zmiennoprzecinkowe
Próbuję przenieść większą aplikację z x86 do ramienia kory a9, ale otrzymuję dziwne błędy segmentacji z funkcjami zmiennoprzecinkowymi, takimi jak modf, gdy kompilujemy aplikację, inne funkcje libc ++ wydają się po prostu radzić sobie z błędami, ale nie powodują awarii (patrz poniżej).
Spróbowałem więc tego małego programu testowego, który również może wywołać błąd. Wynik programu testowego (patrz poniżej) powinien pokazać mój problem.
#include <iostream>
int main(int argc, char *argv[])
{
double x = 80;
double y = 0;
std::cout << x << "\t" << y << std::endl;
return 0;
}
skompilowany na ramieniu kory a9:
@tegra$ g++ -Wall test.cpp -o test_nativ
@tegra$ ./test_nativ
80 0
skompilowany krzyż
@x86$ arm-cortex_a9-linux-gnueabi-g++ test.cpp -o test_cc
@tegra$ ./test_cc
0 1.47895e-309
krzyż skompilowany z opcją linkera „-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
.
Aby odpowiedzieć na niektóre z poniższych komentarzy:
- Kompilator krzyżowy jest ustawiony dla little endian, podobnie jak natywny kompilator na maszynie tegra.
- Nie wierzę, że to problem z wyrównywaniem pamięci, miałam ich udział podczas przenoszenia do uzbrajania i powinny one wysyłać SIGBUS do aplikacji lub logować się do syslog, patrz dokumentacja dla / proc / cpu / alignment.
Moje obecne obejście polega na skopiowaniu skompilowanego toolchaina i użyciu go z LD_LIBRARY_PATH ... niezbyt ładnym, ale na razie wystarczającym.
Edytować:
Dziękuję Ci za Twoje odpowiedzi.
W międzyczasie dowiedziałem się, że dystrybucja Linuksa na urządzeniu tegra została skompilowana z '-mfloat-abi = softfp', chociaż w dokumentacji stwierdzono, że wymagany jest zestaw narzędzi skompilowany z '-mfloat-abi = hard'.
Zmiana narzędzia przyniosła sukces.
Wydaje się, że różnica między twardym i miękkim filtrem może być widoczna przy użyciu „readelf -A” w dowolnym systemie binarnym:
Jeśli wyjście zawiera wiersz: „Tag_ABI_VFP_args: VFP rejestruje”, jest kompilowany z „-mfloat-abi = hard”. Jeśli brakuje tej linii, plik binarny jest najprawdopodobniej skompilowany z opcją -mfloat-abi = softfp.
Wiersz „Tag_ABI_HardFP_use: SP i DP” nie wskazuje kompilatora „-mfloat-abi = hard”.