2013-05-30 11 views
7

Mam związek z długim podwójnym polem.ABI związku przejściowego z długim podwójnym zmieniło się w GCC 4.4

Inicjuję pole i przekazuję je do funkcji.

my_union foo; 
foo.long_double = 10.10; 
bar = baz(foo); 

Podczas kompilowania tego kodu uzyskać:

the ABI of passing union with long double has changed in GCC 4.4 

wydają się być związane ze zmianami wymienionymi tutaj: http://gcc.gnu.org/gcc-4.4/changes.html

Czy to znaczy, że nie może przejść unii mający long double jako pola ? Dlaczego to? I jak mogę to rozwiązać, ponieważ chcę używać długich podwójnych do przechowywania dużych wartości.

Odpowiedz

9

Co oznacza, że ​​wynikowy kod nie jest binarnie zgodny z kodem skompilowanym z poprzednimi wersjami GCC, więc jeśli przekazujesz go pomiędzy bibliotekami pomiędzy binariami skompilowanymi z bieżącą wersją i poprzednią wersją, to nie zadziała . (Patrz komentarz do informacji o układzie pamięci dla transportu sieciowego i zapisywanie plików)

Jak widać z linku, który podałeś:

Code built with previous versions of GCC that uses any of these is not compatible with code built with GCC 4.4.0 or later.

albo nie rób tego, lub sprawdzić, czy wszystkie Twój kod, który używa związków wymienionych w dzienniku zmian, jest kompilowany w tej samej wersji kompilatora (lub technicznie ABI).

http://en.wikipedia.org/wiki/Application_binary_interface

+1

One wyjaśnienie: docs powiedzieć, że ABI przekazywania tych związków jako parametry nie zmieniło, a nie ich układ pamięci (prawdopodobnie zaangażowane rejestry). Przeniesienie ich przez sieci lub zapisanie ich w plikach powinno być bezpieczne. – rodrigo

+0

Zaktualizowana odpowiedź. – xaxxon

+0

Zmieniłem pole na podwójne i teraz działa. Ale dlaczego decyzja projektowa, która jest długa podwójna, jest zabroniona? – jluu

0

spróbuj użyć opcji -msse2 lub -march = K8 podczas compilling

+0

Z opisu dziennika zmian GCC najprawdopodobniej wynika, że ​​nowa wersja jest prawdopodobnie odpowiednią metodą, więc powinieneś spróbować sprawić, aby działał jak teraz, zanim zaczniesz szukać obejść, które mogą nie być konieczne. Ale jeśli tego potrzebujesz, warto na to patrzeć - nie wiem. – xaxxon

Powiązane problemy