__floatsidf
to procedura wykonawcza do konwersji 32-bitowej liczby całkowitej ze znakiem w liczbę zmiennoprzecinkową podwójnej precyzji. Gdzieś w projekcie jest linia, która wygląda następująco:
double foo = bar;
lub coś podobnego, gdzie bar
jest 32-bitową liczbą całkowitą. Może to być również, że dzwonisz jedną z libm
funkcji (lub jakiejkolwiek innej funkcji, naprawdę), że spodziewa się double
z parametrem integer:
foo = pow(bar, baz);
gdzie albo bar
lub baz
(lub oba) jest liczbą całkowitą .
Nie pokazując kodu, niewiele możemy zrobić, aby Ci pomóc.
Aby sprowadzić sprawdzić obiekt plikami kompilator generuje (zanim je połączyć) i spojrzeć w demontażu dla odniesienia do tego symbolu - że powinien powiedzieć, co działać to się dzieje w
Oto. przykład tego, co mam na myśli. Najpierw - kod źródłowy:
#include <math.h>
int function(int x, int y)
{
return pow(x, y);
}
Całkiem proste, prawda? Teraz mam zamiar skompilować go za ramię i demontować:
$ clang -arch arm -O2 -c -o example.o example.c
$ otool -tV example.o
example.o:
(__TEXT,__text) section
_function:
00000000 e92d40f0 push {r4, r5, r6, r7, lr}
00000004 e28d700c add r7, sp, #12
00000008 e1a04001 mov r4, r1
0000000c ebfffffb bl ___floatsidf
00000010 e1a05000 mov r5, r0
00000014 e1a00004 mov r0, r4
00000018 e1a06001 mov r6, r1
0000001c ebfffff7 bl ___floatsidf
00000020 e1a02000 mov r2, r0
00000024 e1a03001 mov r3, r1
00000028 e1a00005 mov r0, r5
0000002c e1a01006 mov r1, r6
00000030 ebfffff2 bl _pow
00000034 ebfffff1 bl ___fixdfsi
00000038 e8bd40f0 pop {r4, r5, r6, r7, lr}
0000003c e12fff1e bx lr
Spójrz na to - dwa połączenia do __floatsidf
i jeden do __fixdfsi
, spełniające dwie konwersje o x
i y
do double
a następnie konwersja typ zwrotu z powrotem do int
.
Czy zawierasz wszystko, co może zawierać odniesienie do symbolu '__floatsidf'? –
Obie odpowiedzi sprowadzają się do tego - nie używaj zmiennoprzecinkowego w jądrze. – ugoren