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”.

questionAnswers(2)

yourAnswerToTheQuestion