__floatsidf
là một thường trình thời gian chạy để chuyển đổi số nguyên đã ký 32 bit thành số dấu chấm động chính xác gấp đôi. Một nơi nào đó trong dự án của bạn là một dòng trông giống như:
double foo = bar;
Hoặc một cái gì đó tương tự, trong đó bar
là số nguyên 32 bit. Nó cũng có thể là bạn đang gọi một trong những libm
chức năng (hay bất kỳ chức năng khác, thực sự) mà hy vọng một double
với một tham số nguyên:
foo = pow(bar, baz);
nơi một trong hai bar
hoặc baz
(hoặc cả hai) là một số nguyên .
Không hiển thị một số mã, chúng tôi không thể làm gì nhiều hơn để trợ giúp.
Để thu hẹp nó xuống, kiểm tra các đối tượng tập tin trình biên dịch của bạn tạo ra (trước khi bạn liên kết chúng) và nhìn vào tháo gỡ cho một tham chiếu đến biểu tượng đó - rằng nên cho bạn biết chức năng nó đang xảy ra trong
Dưới đây là một. ví dụ về ý tôi. Mã nguồn đầu tiên:
#include <math.h>
int function(int x, int y)
{
return pow(x, y);
}
Khá đơn giản, đúng không? Bây giờ, tôi sẽ biên dịch nó cho ARM và tháo rời:
$ 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
Nhìn vào đó - hai cuộc gọi đến __floatsidf
và một để __fixdfsi
, phù hợp với hai chuyển đổi của x
và y
-double
và sau đó chuyển đổi của trở về loại trở lại int
.
Bạn có bao gồm bất kỳ thứ gì có thể chứa tham chiếu đến biểu tượng '__floatsidf' không? –
Cả hai câu trả lời đều đi xuống điều này - không sử dụng dấu chấm động trong hạt nhân. – ugoren