__floatsidf
ist eine Laufzeitroutine zum Konvertieren einer 32-Bit-Ganzzahl mit Vorzeichen in eine Gleitkommazahl mit doppelter Genauigkeit. Irgendwo in Ihrem Projekt ist eine Linie, die wie folgt aussieht:
double foo = bar;
oder etwas ähnliches, wo bar
ist ein 32-Bit-Integer. Es könnte auch sein, dass Sie eine der libm
Funktionen sind telefonisch unter (oder jeder anderen Funktion, wirklich), die ein double
mit einem Integer-Parameter erwartet:
foo = pow(bar, baz);
wo entweder bar
oder baz
(oder beide) eine ganzen Zahl .
Ohne etwas Code anzuzeigen, können wir nicht viel mehr tun, um zu helfen.
es verengen, überprüfen Sie die Objektdateien Compiler erzeugt (bevor Sie sie verknüpfen) und für einen Verweis auf das entsprechende Symbol in der Demontage finden -, dass Sie sollten sagen, was in es funktioniert passiert
Hier ein. Beispiel dessen, was ich meine. Zuerst - Quellcode:
#include <math.h>
int function(int x, int y)
{
return pow(x, y);
}
Ziemlich einfach, oder? Nun, ich werde es für ARM kompilieren und zu demontieren:
$ 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
Blick auf das - zwei Anrufe __floatsidf
und ein bis __fixdfsi
, passend zu den beiden Umwandlungen von x
und y
-double
und dann die Umwandlung der Rückgabetyp zurück zu int
.
Fügen Sie etwas ein, das möglicherweise einen Verweis auf das Symbol "__floatsidf" enthält? –
Beide Antworten kommen auf diese - verwenden Sie nicht Fließkomma im Kernel. – ugoren